//========================================================================
//  SE5 Intelligence Events - Captain Kwok's Balance Mod v125+
//========================================================================
//
// Balance Mod Changes:
// --------------------
// v1.29 Changed - Ship damage event will skip armor and shields
//       Changed - Certain projects can only happen once per turn per target player: Empire information, Planet locations, Treaty Information and System Info
//       Added   - Fx[Execute_Intel_Fleet_Concentrations] to provide the location of the target player's fleets
//       Changed - System maps intel project will open return systems not seen that have the presence of the target player
//       Added   - Fx[Execute_Intel_Planet_Facility_Damage] to target only a planet's facilities
//       Changed - Fx[Execute_Intel_Planet_Cargo_Damage] will only target units in cargo and any damage will ignore any shields present
//       Added   - Fx[Compute_Nearest_Colony_To_Target] to find the closest source player colony to an intel attack location
//       Fixed   - Research disruption project didn't always select a research area that had points accumulated in it
//       Fixed   - The damage minefield project will now report the exact amount of mines to the target player (or the percentage destroyed to the attacker)
// v1.28 Changed - Adjusted project costs across all categories
//       Changed - Modified intel project success rate to take into account attack bonuses and proximity while making some projects easier to accomplish than others
//       Changed - Added Fx[Compute_Average_Distance_To_Player] to be used in the proximity modifier calculation
//       Changed - Added Fx[Get_Treaty_Element_Type_Details] to provide some basic details for the treaty information intel project
// v1.26 Changed - Adjusted resource disruption amounts; will not reduce resources below 1000
// v1.25 Changed - Updated project costs based on 10x reduction in intelligence point generation
//       Added   - Fx[Execute_Intel_Minefield_Damage] for an intel project that detonates a portion of or all of the target's minefield
// v1.21 Fixed   - Disrupt construction queues project had incorrect image references
//       Changed - Changed the steal research project to provide a percentage of points
// v1.20 Added   - Fx[Execute_Intel_Disrupt_Construction_Queue] for intel project Disrupt Construction Queues
//       Changed - Added conditions parameter for Fx[Select_Event_Parameter], Fx[Is_Target_Param_Acceptable] to improve target selection
//       Changed - Added log messages to indicate when a player is receiving cooperative intelligence from another empire
//       Changed - Defensive points are not decreased with each intelligence action
//       Changed - How the project success rate is calculated
// v1.19 Fixed   - Log message for sabotage research project did not properly display the points lost in a tech area (v1.19g)
//       Fixed   - Cooperative intelligence points were not always being used (v1.19g)
//       Fixed   - Planet population happiness project was increasing happiness (v1.19h)
//       Changed - Increased intel project costs (v1.19h)
// v1.17 Changed - Increased all intel project costs
//       Changed - Improve the effects of the ship lose supplies intel event
//       Changed - A ship cargo bomb will destroy supplies or ordnance if no cargo on board
//       Fixed   - A couple of errors in the intel project to delete diplomatic messages
//       Added   - Support for cooperative intel points for defense
// v1.15 Changed - Updated conditions change and value change intel project to new script functions
//       Fixed   - Damage planet value project was not working correctly
//       Fixed   - Sometimes mothballed ships would be targeted for sabotage events
// v1.13 Changed - Increased the disrupt research project effect amount
// v1.12 Fixed   - Sometimes bases would be given movement orders for the change orders intel project
// v1.10 Fixed   - Sometimes resource theft or destroy projects resulted in negative effect amounts
//       Changed - Increased defense points contribution in success rate calculation
//       Changed - Increased some intel project costs to reduce intel spam
// v1.09 Changed - Adjusted some intel project costs
//       Changed - Steal Research will provide only a percentage of points from the tech area
//       Changed - Delete intel project will now subtract a percentage of the target's spending against another Empire
//       Changed - Delete research project will now subtract a percentage of the target's spending in a tech area
//       Changed - A target Empire's planet will only rebel if it is unhappy
// v1.07 Changed - Introduced leaky intel system
//       Changed - Reduced the costs for most intel projects
//       Changed - Empires no longer accumulate intel defense points
// v1.06 Changed - Change around a few effect amounts and tweaked intel project costs
// v0.70 Changed - Reduced the effect amount for some intel projects
//
// Balance Mod To-do List:
// -----------------------
// - Nothing pending
//
// Script Function Request:
// ------------------------
// - Nothing pending

//------------------------------------------------------------------------
// Global Constants
//------------------------------------------------------------------------
globalconst

  PARAM_TYPE_SHIP:                                       long      := 1
  PARAM_TYPE_UNITGROUP:                                  long      := 2
  PARAM_TYPE_PLANET:                                     long      := 3
  PARAM_TYPE_WARP_POINT:                                 long      := 4
  PARAM_TYPE_STAR:                                       long      := 5
  PARAM_TYPE_STORM:                                      long      := 6
  PARAM_TYPE_SYSTEM:                                     long      := 7
  PARAM_TYPE_PLAYER:                                     long      := 8
  PARAM_TYPE_BLACK_HOLE:                                 long      := 9
  PARAM_TYPE_NEBULAE:                                    long      := 10

  PARAM_COND_HAS_ORDERS:                                 long      := 1
  PARAM_COND_HAS_MOVEMENT:                               long      := 2
  PARAM_COND_IS_MINEFIELD:                               long      := 3
  PARAM_COND_HAS_SUPPLIES:                               long      := 4
  PARAM_COND_HAS_CARGO:                                  long      := 5
  PARAM_COND_QUEUE_ACTIVE:                               long      := 6
  PARAM_COND_HAS_POPULATION:                             long      := 7
  PARAM_COND_HAS_UNITS:                                  long      := 8

  INTEL_PROJECT_EASY:                                    real      := 1.1
  INTEL_PROJECT_AVERAGE:                                 real      := 1.2
  INTEL_PROJECT_HARD:                                    real      := 1.3

  INTEL_PROJECT_POROSITY_LOW:                            long      := 150
  INTEL_PROJECT_POROSITY_MEDIUM:                         long      := 100
  INTEL_PROJECT_POROSITY_HIGH:                           long      := 50

  EMPIRE_PROXIMITY_CLOSE:                                long      := 120
  EMPIRE_PROXIMITY_AVERAGE:                              long      := 100
  EMPIRE_PROXIMITY_FAR:                                  long      := 80

  INTEL_EVENT_ID_SHIP_DAMAGE:                            long      := 1
  INTEL_EVENT_ID_SHIP_LOSE_MOVEMENT:                     long      := 2
  INTEL_EVENT_ID_SHIP_LOSE_SUPPLIES:                     long      := 3
  INTEL_EVENT_ID_SHIP_REBELS:                            long      := 4
  INTEL_EVENT_ID_SHIP_EXPERIENCE_CHANGE:                 long      := 5
  INTEL_EVENT_ID_SHIP_CARGO_DAMAGE:                      long      := 6
  INTEL_EVENT_ID_SHIP_ORDERS_CHANGE:                     long      := 7
  INTEL_EVENT_ID_FLEET_CONCENTRATIONS:                   long      := 8
  INTEL_EVENT_ID_SHIP_CONCENTRATIONS:                    long      := 9
  INTEL_EVENT_ID_SHIP_CONSTRUCTION_INFORMATION:          long      := 10
  INTEL_EVENT_ID_SHIP_DESIGNS_STEAL:                     long      := 11
  INTEL_EVENT_ID_MINEFIELD_DAMAGE:                       long      := 12
  INTEL_EVENT_ID_PLANET_CONDITIONS_CHANGE:               long      := 13
  INTEL_EVENT_ID_PLANET_VALUE_CHANGE:                    long      := 14
  INTEL_EVENT_ID_PLANET_POPULATION_CHANGE:               long      := 15
  INTEL_EVENT_ID_PLANET_POPULATION_HAPPINESS_CHANGE:     long      := 16
  INTEL_EVENT_ID_PLANET_POPULATION_RIOT:                 long      := 17
  INTEL_EVENT_ID_PLANET_POPULATION_REBEL:                long      := 18
  INTEL_EVENT_ID_PLANET_CARGO_DAMAGE:                    long      := 19
  INTEL_EVENT_ID_PLANET_FACILITY_DAMAGE:                 long      := 20
  INTEL_EVENT_ID_PLANET_DISRUPT_CONSTRUCTION_QUEUE:      long      := 21
  INTEL_EVENT_ID_PLANET_INFORMATION:                     long      := 22
  INTEL_EVENT_ID_PLANET_LOCATIONS:                       long      := 23
  INTEL_EVENT_ID_PLANET_PLAGUE_CREATED:                  long      := 24
  INTEL_EVENT_ID_EMPIRE_POINTS_CHANGE:                   long      := 25
  INTEL_EVENT_ID_EMPIRE_POINTS_STEAL:                    long      := 26
  INTEL_EVENT_ID_EMPIRE_RESEARCH_STEAL:                  long      := 27
  INTEL_EVENT_ID_EMPIRE_RESEARCH_PROJECT_DELETE:         long      := 28
  INTEL_EVENT_ID_EMPIRE_INTEL_PROJECT_DELETE:            long      := 29
  INTEL_EVENT_ID_EMPIRE_POLITICS_DISRUPT_TRADE:          long      := 30
  INTEL_EVENT_ID_EMPIRE_POLITICS_INTERCEPT_MESSAGE:      long      := 31
  INTEL_EVENT_ID_EMPIRE_POLITICS_TREATY_INFORMATION:     long      := 32
  INTEL_EVENT_ID_EMPIRE_POLITICS_PREVENT_MESSAGES:       long      := 33
  INTEL_EVENT_ID_SYSTEM_INFORMATION:                     long      := 34
  INTEL_EVENT_ID_EMPIRE_INFORMATION:                     long      := 35
  INTEL_EVENT_ID_EMPIRE_UNIT_DESIGNS_INFORMATION:        long      := 36
  INTEL_EVENT_ID_EMPIRE_TECH_REPORTS:                    long      := 37

  MESSAGE_TO_NONE:                                       long      := 0
  MESSAGE_TO_OWNER:                                      long      := 1
  MESSAGE_TO_SECTOR:                                     long      := 2
  MESSAGE_TO_SYSTEM:                                     long      := 3
  MESSAGE_TO_ALL:                                        long      := 4

endglobalconst

//------------------------------------------------------------------------
// Global Variables
//------------------------------------------------------------------------

globalvars

  lng_Datafile_Intel_Text_ID:                    long := 0
  bool_No_Atk_Spending:                          boolean := FALSE
  bool_Do_Not_Execute_Intel_Event:               boolean := FALSE
  bool_Skip_Intel_Event_Empire_Info:             boolean := FALSE
  bool_Skip_Intel_Event_Planet_Locations:        boolean := FALSE
  bool_Skip_Intel_Event_System_Info:             boolean := FALSE
  bool_Skip_Intel_Event_Treaty_Info:             boolean := FALSE
  bool_Skip_Intel_Event_Ship_Concentrations:     boolean := FALSE
  bool_Skip_Intel_Event_Fleet_Concentrations:    boolean := FALSE

endglobalvars

//------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------

//------------------------------------------------------------------------
// Forward Declarations
//------------------------------------------------------------------------
deffunc

function Execute_Intelligence returns boolean
params
end

function Execute_Intel_Attack returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end  

function Execute_Intel_Event returns boolean
params
  intel_id:                  long
  src_plr:                   long
  trg_plr:                   long
end

function Select_Event_Parameter returns long
params
  param_type:                long
  param_cond:                long
  src_plr:                   long
  trg_plr:                   long
end

function Is_Target_Param_Acceptable returns boolean
params
  param_type:                long
  param_cond:                long
  param_id:                  long
end

function Execute_Intel_Ship_Damage returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Ship_Lose_Movement returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Ship_Lose_Supplies returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Ship_Cargo_Damage returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Minefield_Damage returns boolean
params
  sobj_id:                   long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Ship_Orders_Change returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Ship_Rebels returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Ship_Experience_Change returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Conditions_Change returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Value_Change returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Population_Change returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Population_Happiness_Change returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Population_Rebel returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Population_Riot returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Cargo_Damage returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Facility_Damage returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Disrupt_Construction_Queue returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Plague_Created returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Points_Change returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Fleet_Concentrations returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Ship_Concentrations returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Ship_Construction_Information returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Ship_Designs_Steal returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Information returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Planet_Locations returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Points_Steal returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Research_Steal returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Research_Project_Delete returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Intelligence_Project_Delete returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Politics_Disrupt_Trade returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Politics_Intercept_Message returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Politics_Treaty_Information returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Politics_Prevent_Messages returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_System_Information returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Information returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Unit_Designs_Information returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Execute_Intel_Empire_Tech_Reports returns boolean
params
  src_plr:                   long
  trg_plr:                   long
end

function Add_Suspect_Text returns boolean
params
  src_plr:                   long
  trg_plr:                   long
  message_text:              string byref
  plr_caused:                long byref
end

function Compute_Average_Distance_To_Player returns long
params
  src_plr:                   long
  trg_plr:                   long
end

function Compute_Nearest_Colony_To_Target returns long
params
  src_plr:                   long
  trg_plr:                   long
  sobj_sys:                  long
end


function Get_Treaty_Element_Type_Name returns string
params
  elem_type:                 long
end

enddeffunc

//------------------------------------------------------------------------
// Main
//------------------------------------------------------------------------
function Main returns boolean
begin
  set lng_Datafile_Intel_Text_ID := Sys_Load_Datafile(0, "IntelligenceText.txt")

  if (lng_Datafile_Intel_Text_ID > 0) then
    call Execute_Intelligence()
  endif

  call Sys_Unload_Datafile(lng_Datafile_Intel_Text_ID)

end

//------------------------------------------------------------------------
// Execute_Intelligence
//------------------------------------------------------------------------
function Execute_Intelligence returns boolean
vars
  num_players:               long
  atk_spending:              long
  src_plr_index:             long
  trg_plr_index:             long
  src_plr_list:              longlist
  trg_plr_list:              longlist
  atk_spending_list:         longlist
  atk_focus_area:            long
  focus_area_name:           string
  num_items:                 long
  plr_index:                 long
  index:                     long
  pick:                      long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
begin

  // Get the number of players in the game
  set num_players := Sys_Get_Number_Of_Players()

  // Debug output
  call Sys_Debug_Print("Intel", "Cooperative Intelligence:")
  call Sys_Debug_Print("Intel", "-------------------------")

  if (num_players > 0) then
    for src_plr_index := 1 to num_players do
      for trg_plr_index := 1 to num_players do
        set atk_spending := Sys_Get_Empire_Intelligence_Offense_Accumulated(src_plr_index, trg_plr_index)
        // Transfer cooperative intelligence points
        if (atk_spending > 0) then
          set atk_focus_area := Sys_Get_Empire_Intelligence_Focus_Area_Against_Player(src_plr_index, trg_plr_index)
          set focus_area_name := Sys_Get_Empire_Intelligence_Focus_Area_Name(atk_focus_area)
          // Transfer Co-operative Attack points
          if (focus_area_name = "Cooperative Intelligence - Attack") then
            call Sys_Set_Empire_Intelligence_Offense_Accumulated(src_plr_index, trg_plr_index, 0)
            call Sys_Add_Empire_Intelligence_Offense_Accumulated_To_All(trg_plr_index, atk_spending)
            // Debug output
            call Sys_Debug_Print("Intel", "  - " + Sys_Empire_Get_Empire_Name(src_plr_index) + " providing " + Sys_Convert_Long_To_String(atk_spending) + " Attack Points to " + Sys_Empire_Get_Empire_Name(trg_plr_index))
            set atk_spending := 0
            // Log Message
            set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 72 Title")
            set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 72 Text")
            set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 72 Small Picture Filename")
            set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 72 Large Picture Filename")
            set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr_index), TRUE, TRUE)
            // Create the log message for the target player
            call Sys_Add_Empire_Log_Entry(trg_plr_index, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, LOG_TYPE_GIFT_RECEIVED, LOG_CATEGORY_TYPE_EMPIRE_NEWS, LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL, src_plr_index)
          endif
          // Transfer Co-operative Defense points
          if (focus_area_name = "Cooperative Intelligence - Defense") then
            call Sys_Set_Empire_Intelligence_Offense_Accumulated(src_plr_index, trg_plr_index, 0)
            call Sys_Set_Empire_Intelligence_Defense_Accumulated(trg_plr_index, atk_spending + Sys_Get_Empire_Intelligence_Defense_Accumulated(trg_plr_index))
            // Debug output
            call Sys_Debug_Print("Intel", "  - " + Sys_Empire_Get_Empire_Name(src_plr_index) + " providing " + Sys_Convert_Long_To_String(atk_spending) + " Defense Points to " + Sys_Empire_Get_Empire_Name(trg_plr_index))
            set atk_spending := 0
            // Log Message
            set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 73 Title")
            set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 73 Text")
            set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 73 Small Picture Filename")
            set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 73 Large Picture Filename")
            set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr_index), TRUE, TRUE)
            // Create the log message for the target player
            call Sys_Add_Empire_Log_Entry(trg_plr_index, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, LOG_TYPE_GIFT_RECEIVED, LOG_CATEGORY_TYPE_EMPIRE_NEWS, LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL, src_plr_index)
          endif
        endif
      endfor
    endfor
  endif

  // Debug output
  call Sys_Debug_Print("Intel", "Intelligence Spending:")
  call Sys_Debug_Print("Intel", "----------------------")

  // Set our intel attack and defense spending, plus transfer any cooperative amounts
  if (num_players > 0) then
    for src_plr_index := 1 to num_players do
      // Debug output
      call Sys_Debug_Print("Intel", "  - " + Sys_Empire_Get_Empire_Name(src_plr_index))
      call Sys_Debug_Print("Intel", "    - Defense Points = " + Sys_Convert_Long_To_String(Sys_Get_Empire_Intelligence_Defense_Accumulated(src_plr_index)))

      // Set our attack spending against other players (or transfer cooperative points)
      for trg_plr_index := 1 to num_players do
        // Reset variables
        set bool_Skip_Intel_Event_Empire_Info := FALSE
        set bool_Skip_Intel_Event_Planet_Locations := FALSE
        set bool_Skip_Intel_Event_System_Info := FALSE
        set bool_Skip_Intel_Event_Treaty_Info := FALSE
        set bool_Skip_Intel_Event_Fleet_Concentrations := FALSE
        set bool_Skip_Intel_Event_Ship_Concentrations := FALSE
        // Get the attack spending against the target player
        set atk_spending := Sys_Get_Empire_Intelligence_Offense_Accumulated(src_plr_index, trg_plr_index)
        // If we're spending more than 0, then attempt to conduct an attack
        if (atk_spending > 0) then
          set atk_focus_area := Sys_Get_Empire_Intelligence_Focus_Area_Against_Player(src_plr_index, trg_plr_index)
          set focus_area_name := Sys_Get_Empire_Intelligence_Focus_Area_Name(atk_focus_area)
          call src_plr_list.add(src_plr_index)
          call trg_plr_list.add(trg_plr_index)
          call atk_spending_list.add(atk_spending)
          // Debug output
          if (focus_area_name <> "") then
            call Sys_Debug_Print("Intel", "      - Attack Points = " + Sys_Convert_Long_To_String(atk_spending) + " against " + Sys_Empire_Get_Empire_Name(trg_plr_index) + " in focus area " + focus_area_name)
          endif
        else
          set bool_No_Atk_Spending := TRUE
        endif
      endfor
    endfor
  endif

  // Debug output
  call Sys_Debug_Print("Intel", "Intelligence Projects:")
  call Sys_Debug_Print("Intel", "----------------------")

  // Attempt to conduct intel attacks
  set num_items := src_plr_list.count()
  if (num_items > 0) then
    loop
      set pick := Sys_Get_Random_Long(1, num_items)
      set src_plr_index := src_plr_list.get(pick)
      set trg_plr_index := trg_plr_list.get(pick)
      set atk_spending := atk_spending_list.get(pick)

      call Execute_Intel_Attack(src_plr_index, trg_plr_index)

      call src_plr_list.delete(pick)
      call trg_plr_list.delete(pick)
      call atk_spending_list.delete(pick)
      set num_items := src_plr_list.count()

      exitwhen (num_items <= 0)
    endloop
  endif

  // Reset accumulated intel defense points to 0
  for plr_index := 1 to num_players do
    call Sys_Set_Empire_Intelligence_Defense_Accumulated(plr_index, 0)
  endfor

  return TRUE
end

//------------------------------------------------------------------------
// Execute_Intel_Attack
//------------------------------------------------------------------------
function Execute_Intel_Attack returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  atk_focus_area:            long
  focus_area_name:           string
  atk_total:                 long
  atk_spending:              long
  def_total:                 long
  def_spending:              long
  intel_id:                  long
  event_type:                string
  event_cost:                long
  event_difficulty:          real
  event_porosity:            long
  num_items:                 long
  pick:                      long
  loop_count:                long
  def_cost:                  long
  pick_list:                 longlist
  name_list:                 stringlist
  cost_list:                 longlist
  proj_porosity:             longlist
  proj_diff:                 reallist
  intel_type:                long
  atk_modifier:              long := 100
  avg_dist:                  long
  prox_modifier:             long := 100
  def_modifier:              long := 100
  event_diff_mod:            real
  atk_rating:                long
  def_rating:                long
  diff_rating:               long
  success_rate:              long
  min_cost:                  long
begin

  // Set spending for attacking and defending empires
  set atk_total := Sys_Get_Empire_Intelligence_Offense_Accumulated(src_plr, trg_plr)
  set atk_focus_area := Sys_Get_Empire_Intelligence_Focus_Area_Against_Player(src_plr, trg_plr)
  set focus_area_name := Sys_Get_Empire_Intelligence_Focus_Area_Name(atk_focus_area)
  set def_total := Sys_Get_Empire_Intelligence_Defense_Accumulated(trg_plr)

  // Create a list of the possible intel projects
  case focus_area_name
    "Sabotage - Ships & Fleets":
      set min_cost := 300
      set intel_type := 1
      // Ship Damage
      call pick_list.add(INTEL_EVENT_ID_SHIP_DAMAGE)
      call name_list.add("Ship Damage")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Ship lose movement
      call pick_list.add(INTEL_EVENT_ID_SHIP_LOSE_MOVEMENT)
      call name_list.add("Ship Lose Movement")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Ship lose supplies
      call pick_list.add(INTEL_EVENT_ID_SHIP_LOSE_SUPPLIES)
      call name_list.add("Ship Lose Supplies")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Ship rebels
      call pick_list.add(INTEL_EVENT_ID_SHIP_REBELS)
      call name_list.add("Ship Rebels")
      call cost_list.add(3000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_HARD)
      // Ship experience change
      call pick_list.add(INTEL_EVENT_ID_SHIP_EXPERIENCE_CHANGE)
      call name_list.add("Ship Experience Change")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_EASY)
      // Ship cargo damage
      call pick_list.add(INTEL_EVENT_ID_SHIP_CARGO_DAMAGE)
      call name_list.add("Ship Cargo Damage")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Ship orders change
      call pick_list.add(INTEL_EVENT_ID_SHIP_ORDERS_CHANGE)
      call name_list.add("Ship Orders Change")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Minefield damage
      call pick_list.add(INTEL_EVENT_ID_MINEFIELD_DAMAGE)
      call name_list.add("Minefield Damage")
      call cost_list.add(300)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_EASY)
    "Sabotage - Planets & Colonies":
      set min_cost := 500
      set intel_type := 1
      // Planet conditions change
      call pick_list.add(INTEL_EVENT_ID_PLANET_CONDITIONS_CHANGE)
      call name_list.add("Planet Conditions Change")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Planet value change
      call pick_list.add(INTEL_EVENT_ID_PLANET_VALUE_CHANGE)
      call name_list.add("Planet Value Change")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Planet population change
      call pick_list.add(INTEL_EVENT_ID_PLANET_POPULATION_CHANGE)
      call name_list.add("Planet Population Change")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Planet happiness change
      call pick_list.add(INTEL_EVENT_ID_PLANET_POPULATION_HAPPINESS_CHANGE)
      call name_list.add("Planet Population Happiness Change")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_EASY)
      // Planet population riot
      call pick_list.add(INTEL_EVENT_ID_PLANET_POPULATION_RIOT)
      call name_list.add("Planet Population Riot")
      call cost_list.add(3000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_HARD)
      // Planet population rebel
      call pick_list.add(INTEL_EVENT_ID_PLANET_POPULATION_REBEL)
      call name_list.add("Planet Population Rebel")
      call cost_list.add(6000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_HARD)
      // Planet cargo damage
      call pick_list.add(INTEL_EVENT_ID_PLANET_CARGO_DAMAGE)
      call name_list.add("Planet Cargo Damage")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Planet facility damage
      call pick_list.add(INTEL_EVENT_ID_PLANET_FACILITY_DAMAGE)
      call name_list.add("Planet Facility Damage")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Disrupt construction queue
      call pick_list.add(INTEL_EVENT_ID_PLANET_DISRUPT_CONSTRUCTION_QUEUE)
      call name_list.add("Planet Disrupt Construction Queue")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Planet plague
      call pick_list.add(INTEL_EVENT_ID_PLANET_PLAGUE_CREATED)
      call name_list.add("Planet Plague")
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_HARD)
      call cost_list.add(3000)
    "Sabotage - Empire Wide":
      set min_cost := 500
      set intel_type := 1
      // Empire resources lost
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_POINTS_CHANGE)
      call name_list.add("Sabotage Resources")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_EASY)
      // Empire resources stolen
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_POINTS_STEAL)
      call name_list.add("Steal Resources")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Empire research stolen
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_RESEARCH_STEAL)
      call name_list.add("Steal Research")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Empire research lost
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_RESEARCH_PROJECT_DELETE)
      call name_list.add("Disrupt Research")
      call cost_list.add(2000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_HARD)
      // Empire intelligence disrupted
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_INTEL_PROJECT_DELETE)
      call name_list.add("Disrupt Intelligence")
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      call cost_list.add(1000)
    "Sabotage - Political":
      set min_cost := 1000
      set intel_type := 1
      // Disrupt Trade
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_POLITICS_DISRUPT_TRADE)
      call name_list.add("Disrupt Trade")
      call cost_list.add(5000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_HARD)
      // Prevent messages
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_POLITICS_PREVENT_MESSAGES)
      call name_list.add("Disrupt Communications")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_LOW)
      call proj_diff.add(INTEL_PROJECT_EASY)
    "Espionage - Ships & Fleets":
      set min_cost := 200
      set intel_type := 2
      // Fleet concentrations
      call pick_list.add(INTEL_EVENT_ID_FLEET_CONCENTRATIONS)
      call name_list.add("Fleet Concentrations")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Ship concentrations
      call pick_list.add(INTEL_EVENT_ID_SHIP_CONCENTRATIONS)
      call name_list.add("Ship Concentrations")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_EASY)
      // Construction queue details
      call pick_list.add(INTEL_EVENT_ID_SHIP_CONSTRUCTION_INFORMATION)
      call name_list.add("Construction Queue Info")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Ship designs
      call pick_list.add(INTEL_EVENT_ID_SHIP_DESIGNS_STEAL)
      call name_list.add("Steal Ship Designs")
      call cost_list.add(200)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_EASY)
      // Unit designs
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_UNIT_DESIGNS_INFORMATION)
      call name_list.add("Unit Designs Info")
      call cost_list.add(200)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_EASY)
    "Espionage - Planets & Colonies":
      set min_cost := 300
      set intel_type := 2
      // Planet information
      call pick_list.add(INTEL_EVENT_ID_PLANET_INFORMATION)
      call name_list.add("Planet Info")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Planet locations
      call pick_list.add(INTEL_EVENT_ID_PLANET_LOCATIONS)
      call name_list.add("Planet Locations")
      call cost_list.add(300)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_EASY)
    "Espionage - Empire Wide":
      set min_cost := 300
      set intel_type := 2
      // System information
      call pick_list.add(INTEL_EVENT_ID_SYSTEM_INFORMATION)
      call name_list.add("System Info")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_EASY)
      // Empire information
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_INFORMATION)
      call name_list.add("Empire Info")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_MEDIUM)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Empire tech reports
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_TECH_REPORTS)
      call name_list.add("Tech Info")
      call cost_list.add(300)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_EASY)
    "Espionage - Political":
      set min_cost := 500
      set intel_type := 2
      // Intercept messages
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_POLITICS_INTERCEPT_MESSAGE)
      call name_list.add("Intercept Messages")
      call cost_list.add(500)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_LOW)
      call proj_diff.add(INTEL_PROJECT_AVERAGE)
      // Treaty information
      call pick_list.add(INTEL_EVENT_ID_EMPIRE_POLITICS_TREATY_INFORMATION)
      call name_list.add("Treaty Info")
      call cost_list.add(1000)
      call proj_porosity.add(INTEL_PROJECT_POROSITY_HIGH)
      call proj_diff.add(INTEL_PROJECT_EASY)
    "Cooperative Intelligence":
      set intel_type := 0
    "Cooperative Intelligence - Attack":
      set intel_type := 0
    "Cooperative Intelligence - Defense":
      set intel_type := 0
  endcase

  set num_items := pick_list.count()

  if (num_items > 0) then
    set loop_count := 0
    // Set modifiers
    set atk_modifier := 100 + Sys_Get_Empire_Intelligence_Focus_Area_Modifier(src_plr, focus_area_name)
    set def_modifier := 100
    // Calculate proximity modifier
    set avg_dist := Compute_Average_Distance_To_Player(src_plr, trg_plr)

    if (avg_dist > 10) then
      set prox_modifier := 80
    else
      if (avg_dist < 5) then
        set prox_modifier := 120
      else
        set prox_modifier := 100
      endif
    endif

    loop
      set loop_count := loop_count + 1
      set pick := Sys_Get_Random_Long(1, num_items)
      set intel_id := pick_list.get(pick)
      // Get the intel event details
      set event_type := name_list.get(pick)
      set event_cost := cost_list.get(pick)
      set event_diff_mod := proj_diff.get(pick)
      // Calculate the ratings
      set atk_spending := Sys_Min_Long(event_cost, atk_total)
      set atk_rating := Sys_Trunc(atk_spending * atk_modifier * prox_modifier / 10000)
      set def_modifier := proj_porosity.get(pick)
      set def_spending := def_total
      set def_rating := Sys_Trunc(def_spending * def_modifier / 100)
      set diff_rating := Sys_Trunc(event_cost ^ event_diff_mod)

      // Attempt to execute the project if we can afford it
      if (atk_spending >= event_cost) then
        // Calculate the project success rate p = (Atk*Atk_Mod*Prox_Mod) / (Def*Def_Mod*Event_Cost^Difficulty)
        set success_rate := Sys_Trunc(atk_rating / (def_rating + diff_rating) * 100)
        // Debug text
        call Sys_Debug_Print("Intel", "  - Project " + event_type + " Cost = " + Sys_Convert_Long_To_String(event_cost) + " points")
        call Sys_Debug_Print("Intel", "    - " + Sys_Empire_Get_Empire_Name(src_plr) + " attacks with " + Sys_Convert_Long_To_String(atk_spending) + " points (" + Sys_Convert_Long_To_String(atk_total) + ")")
        call Sys_Debug_Print("Intel", "    - " + Sys_Empire_Get_Empire_Name(trg_plr) + " defends with " + Sys_Convert_Long_To_String(def_spending) + " points")
        call Sys_Debug_Print("Intel", "    - Atk Rating = " + Sys_Convert_Long_To_String(atk_rating) + "; Proximity Modifier = " + Sys_Convert_Long_To_String(prox_modifier) + "%; Def Rating = " + Sys_Convert_Long_To_String(def_rating) + "; Diff Rating = " + Sys_Convert_Long_To_String(diff_rating))
        call Sys_Debug_Print("Intel", "    - Success % = " + Sys_Convert_Long_To_String(success_rate))

        // Is the project successful?
        if (success_rate > Sys_Get_Random_Long(0, 100)) then
          // Is the project successful?
          if Execute_Intel_Event(intel_id, src_plr, trg_plr) then
            // Intel project successful
            // Adjust our intel statistics
            call Sys_Add_Empire_Intelligence_Statistic(trg_plr, 6)
            case intel_type
              1:
                call Sys_Add_Empire_Intelligence_Statistic(src_plr, 1)
              2:
                call Sys_Add_Empire_Intelligence_Statistic(src_plr, 3)
            endcase
            // Debug output
            call Sys_Debug_Print("Intel", "    - " + Sys_Empire_Get_Empire_Name(src_plr) + " project (" + event_type + ", " + Sys_Convert_Long_To_String(event_cost) + ") successful against " + Sys_Empire_Get_Empire_Name(trg_plr))
          else
            // Intel project unsuccessful
            // Adjust our intel statistics
            call Sys_Add_Empire_Intelligence_Statistic(trg_plr, 5)
            case intel_type
              1:
                call Sys_Add_Empire_Intelligence_Statistic(src_plr, 2)
              2:
                call Sys_Add_Empire_Intelligence_Statistic(src_plr, 4)
            endcase
            // Debug output
            if (bool_Do_Not_Execute_Intel_Event) then
              call Sys_Debug_Print("Intel", "    - " + Sys_Empire_Get_Empire_Name(src_plr) + " project (" + event_type + ", " + Sys_Convert_Long_To_String(event_cost) + ") failed against " + Sys_Empire_Get_Empire_Name(trg_plr) + " due to luck or intel avoidance")
            else
              call Sys_Debug_Print("Intel", "    - " + Sys_Empire_Get_Empire_Name(src_plr) + " project (" + event_type + ", " + Sys_Convert_Long_To_String(event_cost) + ") failed (no target) " + Sys_Empire_Get_Empire_Name(trg_plr))
            endif
          endif
        else
          // Intel project unsuccessful
          // Adjust our intel statistics
          call Sys_Add_Empire_Intelligence_Statistic(trg_plr, 5)
          case intel_type
            1:
              call Sys_Add_Empire_Intelligence_Statistic(src_plr, 2)
            2:
              call Sys_Add_Empire_Intelligence_Statistic(src_plr, 4)
          endcase
          // Debug output
          call Sys_Debug_Print("Intel", "    - " + Sys_Empire_Get_Empire_Name(src_plr) + " project (" + event_type + ", " + Sys_Convert_Long_To_String(event_cost) + ") failed against " + Sys_Empire_Get_Empire_Name(trg_plr))
        endif
        // Subtract the intel project's cost from our attack points
        set atk_total := atk_total - event_cost
        set def_total := def_total - Sys_Divide_Long(event_cost, 2)
        // Debug output
        call Sys_Debug_Print("Intel", "    - " + Sys_Empire_Get_Empire_Name(src_plr) + " Attack spending remaining = " + Sys_Convert_Long_To_String(atk_total))
        call Sys_Debug_Print("Intel", "    - " + Sys_Empire_Get_Empire_Name(trg_plr) + " Defense remaining = " + Sys_Convert_Long_To_String(def_total))
        call Sys_Debug_Print("Intel", "  ------")
      else
        // Roll again
      endif

      // Don't let attack or defense spending be negative
      if (atk_total < 0) then
        set atk_total := 0
      endif
      if (def_total < 0) then
        set def_total := 0
      endif

      // Update current attack and defense points
      call Sys_Set_Empire_Intelligence_Offense_Accumulated(src_plr, trg_plr, atk_total)
      call Sys_Set_Empire_Intelligence_Defense_Accumulated(trg_plr, def_total)

      exitwhen (loop_count > (2 * num_items)) or (atk_total < min_cost)
    endloop
  else
    // Do nothing
  endif

  return TRUE
end

//------------------------------------------------------------------------
// Execute_Intel_Event
//------------------------------------------------------------------------
function Execute_Intel_Event returns boolean
params
  intel_id:                  long
  src_plr:                   long
  trg_plr:                   long
vars
  retval:                    boolean := FALSE
  obj_id:                    long := 0
begin

  // Select an appropriate parameter for the intel attack
  case intel_id
    INTEL_EVENT_ID_SHIP_DAMAGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP, 0, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Ship_Damage(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_SHIP_LOSE_MOVEMENT:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP, PARAM_COND_HAS_MOVEMENT, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Ship_Lose_Movement(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_SHIP_LOSE_SUPPLIES:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP, PARAM_COND_HAS_SUPPLIES, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Ship_Lose_Supplies(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_SHIP_REBELS:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP, 0, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Ship_Rebels(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_SHIP_EXPERIENCE_CHANGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP, 0, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Ship_Experience_Change(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_SHIP_CARGO_DAMAGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP, PARAM_COND_HAS_CARGO, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Ship_Cargo_Damage(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_SHIP_ORDERS_CHANGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP, PARAM_COND_HAS_ORDERS, src_plr, trg_plr)
      if (obj_id > 0) and (Sys_Get_Space_Object_Maximum_Movement(obj_id) > 0) then
        set retval := Execute_Intel_Ship_Orders_Change(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_MINEFIELD_DAMAGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_UNITGROUP, PARAM_COND_IS_MINEFIELD, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Minefield_Damage(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_FLEET_CONCENTRATIONS:
      if (not bool_Skip_Intel_Event_Fleet_Concentrations) then
        set retval := Execute_Intel_Fleet_Concentrations(src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_SHIP_CONCENTRATIONS:
      if (not bool_Skip_Intel_Event_Ship_Concentrations) then
        set retval := Execute_Intel_Ship_Concentrations(src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_SHIP_CONSTRUCTION_INFORMATION:
      set retval := Execute_Intel_Ship_Construction_Information(src_plr, trg_plr)
    INTEL_EVENT_ID_SHIP_DESIGNS_STEAL:
      set retval := Execute_Intel_Ship_Designs_Steal(src_plr, trg_plr)
    INTEL_EVENT_ID_PLANET_CONDITIONS_CHANGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, 0, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Planet_Conditions_Change(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_VALUE_CHANGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, 0, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Planet_Value_Change(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_POPULATION_CHANGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, PARAM_COND_HAS_POPULATION, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Planet_Population_Change(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_POPULATION_HAPPINESS_CHANGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, 0, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Planet_Population_Happiness_Change(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_POPULATION_RIOT:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, PARAM_COND_HAS_POPULATION, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Planet_Population_Riot(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_POPULATION_REBEL:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, 0, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Planet_Population_Rebel(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_CARGO_DAMAGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, PARAM_COND_HAS_UNITS, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Planet_Cargo_Damage(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_CARGO_DAMAGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, 0, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Planet_Facility_Damage(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_DISRUPT_CONSTRUCTION_QUEUE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, PARAM_COND_QUEUE_ACTIVE, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Disrupt_Construction_Queue(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_INFORMATION:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, 0, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Planet_Information(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_LOCATIONS:
      if (not bool_Skip_Intel_Event_Planet_Locations) then
        set retval := Execute_Intel_Planet_Locations(src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_PLANET_PLAGUE_CREATED:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET, 0, src_plr, trg_plr)
      if (obj_id > 0) then
        set retval := Execute_Intel_Planet_Plague_Created(obj_id, src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_EMPIRE_POINTS_CHANGE:
      set retval := Execute_Intel_Empire_Points_Change(src_plr, trg_plr)
    INTEL_EVENT_ID_EMPIRE_POINTS_STEAL:
      set retval := Execute_Intel_Empire_Points_Steal(src_plr, trg_plr)
    INTEL_EVENT_ID_EMPIRE_RESEARCH_STEAL:
      set retval := Execute_Intel_Empire_Research_Steal(src_plr, trg_plr)
    INTEL_EVENT_ID_EMPIRE_RESEARCH_PROJECT_DELETE:
      set retval := Execute_Intel_Empire_Research_Project_Delete(src_plr, trg_plr)
    INTEL_EVENT_ID_EMPIRE_INTEL_PROJECT_DELETE:
      set retval := Execute_Intel_Empire_Intelligence_Project_Delete(src_plr, trg_plr)
    INTEL_EVENT_ID_EMPIRE_POLITICS_DISRUPT_TRADE:
      set retval := Execute_Intel_Empire_Politics_Disrupt_Trade(src_plr, trg_plr)
    INTEL_EVENT_ID_EMPIRE_POLITICS_INTERCEPT_MESSAGE:
      set retval := Execute_Intel_Empire_Politics_Intercept_Message(src_plr, trg_plr)
    INTEL_EVENT_ID_EMPIRE_POLITICS_TREATY_INFORMATION:
      if (not bool_Skip_Intel_Event_Treaty_Info) then
        set retval := Execute_Intel_Empire_Politics_Treaty_Information(src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_EMPIRE_POLITICS_PREVENT_MESSAGES:
      set retval := Execute_Intel_Empire_Politics_Prevent_Messages(src_plr, trg_plr)
    INTEL_EVENT_ID_SYSTEM_INFORMATION:
      if (not bool_Skip_Intel_Event_System_Info) then
        set retval := Execute_Intel_System_Information(src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_EMPIRE_INFORMATION:
      if (not bool_Skip_Intel_Event_Empire_Info) then
        set retval := Execute_Intel_Empire_Information(src_plr, trg_plr)
      endif
    INTEL_EVENT_ID_EMPIRE_UNIT_DESIGNS_INFORMATION:
      set retval := Execute_Intel_Empire_Unit_Designs_Information(src_plr, trg_plr)
    INTEL_EVENT_ID_EMPIRE_TECH_REPORTS:
      set retval := Execute_Intel_Empire_Tech_Reports(src_plr, trg_plr)
  endcase

  return retval
end

//------------------------------------------------------------------------
// Select_Event_Parameter
//------------------------------------------------------------------------
function Select_Event_Parameter returns long
params
  param_type:                long
  param_cond:                long
  src_plr:                   long
  trg_plr:                   long
vars
  sobj_list:                 longlist
  sobj_id:                   long := 0
  sobj_sys_loc:              long
  sobj_sect_loc:             long
  sobj_sys_dist:             long
  sobj_target_pts:           longlist
  target_pts:                long
  total_target_pts:          long
  loop_count:                long
  list_count:                long
  list_index:                long
  pick:                      long
begin

  // Choose the appropriate target type
  case param_type
    PARAM_TYPE_SHIP:
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_SHIP, sobj_list, TRUE, FALSE, trg_plr)
    PARAM_TYPE_UNITGROUP:
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_UNITGROUP, sobj_list, TRUE, FALSE, trg_plr)
    PARAM_TYPE_PLANET:
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_PLANET, sobj_list, TRUE, FALSE, trg_plr)
    PARAM_TYPE_WARP_POINT:
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_WARP_POINT, sobj_list, FALSE, FALSE, 0)
    PARAM_TYPE_STAR:
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_STAR, sobj_list, FALSE, FALSE, 0)
    PARAM_TYPE_STORM:
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_STORM, sobj_list, FALSE, FALSE, 0)
    PARAM_TYPE_SYSTEM:
      call Sys_Get_List_Of_Solar_Systems(sobj_list)
    PARAM_TYPE_PLAYER:
      call Sys_Get_List_Of_All_Players(sobj_list)
  endcase

if (param_type <> PARAM_TYPE_PLAYER) then
    // Generate a list of target scores
    set list_count := sobj_list.count()
    if (list_count > 0) then
      for list_index := 1 to list_count do
        set sobj_id := sobj_list.get(list_index)
        set target_pts := 0
        call sobj_target_pts.add(target_pts)
        // Is the target acceptable? If not acceptable, the target score will remain 0 and that target cannot be chosen
        if (Is_Target_Param_Acceptable(param_type, param_cond, sobj_id)) then
          set target_pts := target_pts + 1
          // Get the proximity of the target
          set sobj_sys_loc := Sys_Get_Space_Object_System_Location(sobj_id)
          set sobj_sect_loc := Sys_Get_Space_Object_Sector_Location(sobj_id)
          set sobj_sys_dist := Compute_Nearest_Colony_To_Target(src_plr, trg_plr, sobj_sys_loc)
          // Add to target score if it is relatively close
          if (sobj_sys_dist < 3) then
             if (sobj_sys_dist < 2) then
               set target_pts := target_pts + 4
             else
               set target_pts := target_pts + 2
             endif
          endif
          // Set the target score
          call sobj_target_pts.set(list_index, target_pts)
          // Debug output
          call Sys_Debug_Print("Intel", "      - Potential Target = " + Sys_Get_Space_Object_Name(sobj_id) + "; Target Pts = " + Sys_Convert_Long_To_String(target_pts))
        else
          // Debug output
          call Sys_Debug_Print("Intel", "      - Potential Target = " + Sys_Get_Space_Object_Name(sobj_id) + " not acceptable!")
        endif
        // Sum all target points
        set total_target_pts := total_target_pts + target_pts
      endfor
    endif

    // Pick a specific target from a list of valid targets
    set list_count := sobj_list.count()
    if (list_count > 0) then
      // Debug Output
      call Sys_Debug_Print("Intel", "      - There are " + Sys_Convert_Long_To_String(list_count) + " potential targets; Total Target Pts = " + Sys_Convert_Long_To_String(total_target_pts))
      set loop_count := 0
      set sobj_id := 0
      // Note
      loop
        set loop_count := loop_count + 1
        set pick := Sys_Get_Random_Long(1, list_count)
        set target_pts := sobj_target_pts.get(pick)
        // Choose the target by weighted chance
        if (target_pts > 0) then
          if (target_pts >= Sys_Get_Random_Long(1, total_target_pts)) then
            set sobj_id := sobj_list.get(pick)
          endif
        endif
        // Exit when an target object is chosen
        exitwhen (sobj_id > 0) or (loop_count > 100)
      endloop
      // Temp debug output
      call Sys_Debug_Print("Intel", "      - # Loops = " + Sys_Convert_Long_To_String(loop_count))
    else
      // Debug Output
      call Sys_Debug_Print("Intel", "      - There are no potential targets")
    endif
  else
    set sobj_id := 0
  endif

  if (sobj_id > 0) then
    // Debug output
    call Sys_Debug_Print("Intel", "      - Selected Target = " + Sys_Get_Space_Object_Name(sobj_id) + "; Target Pts = " + Sys_Convert_Long_To_String(target_pts))
  else
    // Debug Output
    call Sys_Debug_Print("Intel", "      - No targets")
  endif

  return sobj_id
end

//------------------------------------------------------------------------
// Is_Target_Param_Acceptable
//------------------------------------------------------------------------
function Is_Target_Param_Acceptable returns boolean
params
  param_type:                long
  param_cond:                long
  param_id:                  long
vars
  retval:                    boolean := TRUE
  sys_loc:                   long
  sect_loc:                  long
  lst_queue_items:           longlist
  plr_owner:                 long
  plr:                       long
  param_unit_id:             long
  param_group_type:          string
  event_mod:                 long
begin

  // Execute the event
  set bool_Do_Not_Execute_Intel_Event := FALSE

  // Get the object's details
  if ((param_type <> PARAM_TYPE_PLAYER) and (param_type <> PARAM_TYPE_SYSTEM)) then
    set sys_loc := Sys_Get_Space_Object_System_Location(param_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(param_id)
    set plr_owner := Sys_Get_Space_Object_Owner(param_id)
  endif

  // Special conditions
  case param_cond
    // Don't target ships with no orders for Change Orders
    PARAM_COND_HAS_ORDERS:
      if (Sys_Get_Space_Object_Order_Count(param_id) = 0) then
        set retval := FALSE
      endif
    // Don't target ships for lost movement if they have none
    PARAM_COND_HAS_MOVEMENT:
      if (Sys_Get_Space_Object_Maximum_Movement(param_id) = 0) then
        set retval := FALSE
      endif
    // Don't target ships for lost supplies if they have none
    PARAM_COND_HAS_SUPPLIES:
      if (Sys_Get_Space_Object_Current_Supply(param_id) < 500) then
        set retval := FALSE
      endif
    // Don't target planets/ships for destroy cargo if they have none
    PARAM_COND_HAS_CARGO:
      if (Sys_Does_Space_Object_Cargo_Have_Non_Supply_Ordnance_Item(param_id)) then
        set retval := FALSE
      endif
    // Don't target planets for disrupt construction queues if they are not building anything
    PARAM_COND_QUEUE_ACTIVE:
      if Sys_Get_Construction_Queue_Items_List(param_id, lst_queue_items) then
        if (lst_queue_items.count() < 1) then
          set retval := FALSE
        endif
      endif
    // Don't target planets for destroy population if there is none
    PARAM_COND_HAS_POPULATION:
      if (Sys_Get_Planet_Population(param_id) < 1) then
        set retval := FALSE
      endif
    // The planet has units in cargo
    PARAM_COND_HAS_UNITS:
      if (Sys_Get_Space_Object_Cargo_Space_Used_On_Type(param_id, CARGO_ITEM_TYPE_UNIT, "") < 1) then
        set retval := FALSE
      endif
    // The unit group in a minefield
    PARAM_COND_IS_MINEFIELD:
      if (param_type = PARAM_TYPE_UNITGROUP) then
        if (Sys_Get_Number_Of_Units_In_Space_Sector(plr_owner, "Mine", sys_loc, sect_loc) <= 0) then
          set retval := FALSE
        else
          // Make sure it's mines!
          set param_unit_id := Sys_Get_Space_Object_Cargo_Item_ID(param_id, 1)
          set param_group_type := Sys_Get_Space_Object_Cargo_Item_Unit_Type(param_id, param_unit_id)
          // Check the group to make sure its mines
          if (param_group_type = "Mine") then
            // Temp debug output
            call Sys_Debug_Print("Intel", "      - It's really a minefield! Object = " + Sys_Get_Space_Object_Name(param_id))
          else
            // Temp debug output
            call Sys_Debug_Print("Intel", "      - Unit type = " + param_group_type + " (" + Sys_Get_Space_Object_Name(param_id) + ")")
            set retval := FALSE
          endif
        endif
      endif
  endcase

  // Don't target inactive ships
  if (param_type = PARAM_TYPE_SHIP) then
    if Sys_Is_Space_Object_Mothballed(param_id) then
      set retval := FALSE
    endif
  endif

  // Intel Prevention
  if (sys_loc > 0) and (retval) then
    set event_mod := Sys_Get_Solar_System_Bad_Intel_Avoidance_Percent(sys_loc)
    // Do not execute the project if the event modifier is less then the avoidance percentage
    if (Sys_Get_Random_Long(1, 100) <= event_mod) then
      set retval := FALSE
      set bool_Do_Not_Execute_Intel_Event := TRUE
    endif
  endif

  // Luck
 if (sys_loc > 0) and (retval) then
    set event_mod := Sys_Get_Solar_System_Bad_Event_Avoidance_Percent(sys_loc)
    // Do not execute the project if the event modifier is less then the chance due to luck
    if (Sys_Get_Random_Long(1, 100) <= event_mod) then
      set retval := FALSE
      set bool_Do_Not_Execute_Intel_Event := TRUE
    endif
  endif

  return retval
end

//------------------------------------------------------------------------
// Execute_Intel_Ship_Damage
//------------------------------------------------------------------------
function Execute_Intel_Ship_Damage returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
vars
  dmg_amount:                long
  min_dmg:                   long
  max_dmg:                   long
  ship_structure:            long
  ship_destroyed:            boolean
  sys_loc:                   long
  sect_loc:                  long
  ship_name:                 string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's ship details
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)
    set ship_structure := Sys_Get_Space_Object_Total_Tonnage_Structure(ship_id) - Sys_Get_Space_Object_Current_Armor_Structure(ship_id)
    set min_dmg := Sys_Trunc(0.1 * Sys_Get_Space_Object_Total_Tonnage_Structure(ship_id))
    set max_dmg := Sys_Trunc(1.1 * Sys_Get_Space_Object_Total_Tonnage_Structure(ship_id))

    // Choose a damage amount between 10-50% of the target Empire's ship structure
    set dmg_amount := Sys_Get_Random_Long(min_dmg, max_dmg)

    // Apply damage to the internal components of the target ship
    if (dmg_amount > 0) then
      if (dmg_amount > ship_structure) then
        set ship_destroyed := Sys_Space_Object_Take_Damage(ship_id, "Skips Shields And Armor", dmg_amount)
      else
        call Sys_Space_Object_Take_Damage(ship_id, "Skips Shields And Armor", dmg_amount)
      endif

      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SABOTAGE_BY_US
      if (ship_destroyed) then
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 3 Title")
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 3 Text")
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 3 Small Picture Filename")
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 3 Large Picture Filename")
      else
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 1 Title")
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 1 Text")
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 1 Small Picture Filename")
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 1 Large Picture Filename")
      endif

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%DamageAmount%]", Sys_Convert_Long_To_String(dmg_amount), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SHIP_DAMAGED
      if (ship_destroyed) then
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 4 Title")
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 4 Text")
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 4 Small Picture Filename")
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 4 Large Picture Filename")
      else
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 2 Title")
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 2 Text")
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 2 Small Picture Filename")
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 2 Large Picture Filename")
      endif

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%DamageAmount%]", Sys_Convert_Long_To_String(dmg_amount), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)

      call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endif
  endif

  return (ship_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Ship_Lose_Movement
//------------------------------------------------------------------------
function Execute_Intel_Ship_Lose_Movement returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
vars
  move_amount:               long
  max_move:                  long
  sys_loc:                   long
  sect_loc:                  long
  ship_name:                 string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
  lost_movement:             boolean := FALSE
begin

  // Get the target Empire's ship details
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)
    set max_move := Sys_Get_Space_Object_Maximum_Movement(ship_id)

    // Determine the movement amount of the target Empire's ship
    if (max_move > 0) then
      set move_amount := Sys_Get_Random_Long(1, max_move)
    endif

    // Reduced the movement amount for the target Empire's ship
    if (move_amount > 0) then
      set lost_movement := Sys_Space_Object_Change_Movement(ship_id, -move_amount)

      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SABOTAGE_BY_US
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 33 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 33 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 33 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 33 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%MoveAmount%]", Sys_Convert_Long_To_String(move_amount), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SHIP_LOSE_MOVEMENT
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 34 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 34 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 34 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 34 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%MoveAmount%]", Sys_Convert_Long_To_String(move_amount), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)

      call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    endif
  endif

  return (move_amount > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Ship_Lose_Supplies
//------------------------------------------------------------------------
function Execute_Intel_Ship_Lose_Supplies returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
vars
  supply_amount:             long
  min_supply:                long
  max_supply:                long
  ordnance_amount:           long
  min_ordnance:              long
  max_ordnance:              long
  sys_loc:                   long
  sect_loc:                  long
  ship_owner:                long
  ship_name:                 string
  lost_supplies:             boolean := FALSE
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's ship details
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_owner := Sys_Get_Space_Object_Owner(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)
    set max_supply := Sys_Get_Space_Object_Current_Supply(ship_id)
    set min_supply := Sys_Divide_Long(max_supply, 2)
    set max_ordnance := Sys_Get_Space_Object_Current_Ordnance(ship_id)
    set min_ordnance := Sys_Divide_Long(max_ordnance, 2)

    // Determine the amount of supplies and ordnance to remove from the target ship
    set supply_amount := Sys_Get_Random_Long(min_supply, max_supply)
    set ordnance_amount := Sys_Get_Random_Long(min_ordnance, max_ordnance)

    // Change the supply amount on the target ship (if applicable)
    if (supply_amount > 0) then
      set lost_supplies := Sys_Space_Object_Change_Supplies(ship_id, -supply_amount)
    endif

    // Change the ordnance amount on the target ship (if applicable)
    if (ordnance_amount > 0) then
      set lost_supplies := Sys_Space_Object_Change_Ordnance(ship_id, -ordnance_amount)
    endif

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 5 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 5 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 5 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 5 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SupplyAmount%]", Sys_Convert_Long_To_String(supply_amount), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OrdnanceAmount%]", Sys_Convert_Long_To_String(ordnance_amount), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SHIP_LOSE_SUPPLY
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 6 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 6 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 6 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 6 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SupplyAmount%]", Sys_Convert_Long_To_String(supply_amount), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OrdnanceAmount%]", Sys_Convert_Long_To_String(ordnance_amount), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (lost_supplies > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Ship_Rebels
//------------------------------------------------------------------------
function Execute_Intel_Ship_Rebels returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  ship_name:                 string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's ship details
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // Change the target Empire's ship ownership to the source Empire
    call Sys_Space_Object_Set_To_New_Owner(ship_id, src_plr)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 7 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 7 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 7 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 7 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SHIP_REBEL
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 8 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 8 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 8 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 8 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (ship_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Ship_Experience_Change
//------------------------------------------------------------------------
function Execute_Intel_Ship_Experience_Change returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  experience_amt:            long
  ship_name:                 string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's ship details
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)
    set experience_amt := Sys_Get_Random_Long(-10000, -1000)

    // Change the target Empire's ship experience
    call Sys_Space_Object_Change_Experience(ship_id, experience_amt)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 9 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 9 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 9 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 9 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SHIP_EXPERIENCE_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 10 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 10 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 10 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 10 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (ship_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Ship_Cargo_Damage
//------------------------------------------------------------------------
function Execute_Intel_Ship_Cargo_Damage returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
vars
  has_cargo:                 boolean := TRUE
  sys_loc:                   long
  sect_loc:                  long
  ship_name:                 string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's ship details
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // Delete the cargo of the target Empire's ship
    if Sys_Does_Space_Object_Cargo_Have_Non_Supply_Ordnance_Item(ship_id) then
      call Sys_Space_Object_Delete_Cargo(ship_id)
    else
      // If has no cargo, damage its supplies/ordnance instead
      set has_cargo := FALSE
      call Execute_Intel_Ship_Lose_Supplies(ship_id, src_plr, trg_plr)
    endif

    if (has_cargo) then
      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SABOTAGE_BY_US
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 11 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 11 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 11 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 11 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SHIP_CARGO_DAMAGE
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 12 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 12 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 12 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 12 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
      call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endif
  endif

  return (ship_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Ship_Orders_Change
//------------------------------------------------------------------------
function Execute_Intel_Ship_Orders_Change returns boolean
params
  ship_id:                   long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  target_sys_loc:            long
  target_sect_loc:           long
  ship_name:                 string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's ship details
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // Clear the orders of the target Empire's ship
    call Sys_Space_Object_Clear_Orders(ship_id)
    call Sys_Space_Object_Clear_Fleet(ship_id)

    // Order the target Empire's ship to a random location
    set target_sys_loc := Sys_Get_Random_Long(1, Sys_Get_Number_Of_Solar_Systems())
    set target_sect_loc := Sys_Get_Random_Sector()
    call Sys_Give_Space_Object_Order_Moveto(ship_id, target_sys_loc, target_sect_loc)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 13 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 13 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 13 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 13 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SHIP_ORDERS_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 14 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 14 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 14 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 14 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (ship_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Minefield_Damage
//------------------------------------------------------------------------
function Execute_Intel_Minefield_Damage returns boolean
params
  sobj_id:                   long
  src_plr:                   long
  trg_plr:                   long
vars
  num_mines:                 long
  num_mines_left:            long
  num_mines_destroyed:       long
  dmg_amount:                long
  dmg_pct:                   long
  mines_destroyed:           boolean := FALSE
  sys_loc:                   long
  sect_loc:                  long
  sobj_name:                 string
  sobj_structure:            long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's minefield details
  if (sobj_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(sobj_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(sobj_id)
    set num_mines := Sys_Get_Number_Of_Units_In_Space_Sector(trg_plr, "Mine", sys_loc, sect_loc)
    set sobj_name := Sys_Get_Space_Object_Name(sobj_id)
    set sobj_structure := Sys_Get_Space_Object_Total_Tonnage_Structure(sobj_id)
    set dmg_pct := Sys_Get_Random_Long(10, 120)

    // Choose a damage amount between 10~120% of the target minefield structure
    set dmg_amount := Sys_Trunc(dmg_pct * sobj_structure / 100)

    // Temp debug output
    call Sys_Debug_Print("Events", "        - # Mines = " + Sys_Convert_Long_To_String(num_mines))
    call Sys_Debug_Print("Events", "        - kT structure = " + Sys_Convert_Long_To_String(sobj_structure))
    call Sys_Debug_Print("Events", "        - Damage % = " + Sys_Convert_Long_To_String(dmg_pct))
    call Sys_Debug_Print("Events", "        - kT damage = " + Sys_Convert_Long_To_String(dmg_amount))

    // Apply normal damage to the target empire's minefield
    if (dmg_amount > 0) then
      call Sys_Space_Object_Take_Damage(sobj_id, "Normal", dmg_amount)

      set num_mines_left := Sys_Get_Number_Of_Units_In_Space_Sector(trg_plr, "Mine", sys_loc, sect_loc)
      set num_mines_destroyed := num_mines - num_mines_left
      // Calculate an estimate to report back to the conducting empire (rounded down to nearest ten)
      if (num_mines > 0) then
        set dmg_pct := Sys_Trunc(num_mines_destroyed / num_mines * 10) * 10
      endif
      // Debug output
      call Sys_Debug_Print("Events", "        - # Mines left = " + Sys_Convert_Long_To_String(num_mines_left))

      if (num_mines_left = 0) then
        set mines_destroyed := TRUE
      endif

      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SABOTAGE_BY_US
      if (mines_destroyed) then
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 76 Title")
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 76 Text")
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 76 Small Picture Filename")
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 76 Large Picture Filename")
      else
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 74 Title")
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 74 Text")
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 74 Small Picture Filename")
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 74 Large Picture Filename")
      endif

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", sobj_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%DamageAmount%]", Sys_Convert_Long_To_String(dmg_pct), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SHIP_DAMAGED
      if (mines_destroyed) then
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 77 Title")
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 77 Text")
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 77 Small Picture Filename")
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 77 Large Picture Filename")
      else
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 75 Title")
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 75 Text")
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 75 Small Picture Filename")
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 75 Large Picture Filename")
      endif

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%VehicleName%]", sobj_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%DamageAmount%]", Sys_Convert_Long_To_String(num_mines_destroyed), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)

      call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endif
  endif

  return (sobj_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_Conditions_change
//------------------------------------------------------------------------
function Execute_Intel_Planet_Conditions_Change returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  conditions_change:         real
  planet_name:               string
  planet_conditions:         real
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's planet details
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)
    set planet_conditions := Sys_Get_Planet_Conditions(planet_id)

    // Change the conditions of the target Empire's planet
    set conditions_change := -Sys_Get_Random_Long(1, 5) / 10
    call Sys_Change_Planet_Conditions(planet_id, conditions_change)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 15 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 15 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 15 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 15 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_PLANET_CONDITION_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 16 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 16 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 16 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 16 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (planet_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_value_Change
//------------------------------------------------------------------------
function Execute_Intel_Planet_Value_Change returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  value_change:              long
  planet_name:               string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's planet details
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Reduce the resource value of the target Empire's Planet
    set value_change := -Sys_Get_Random_Long(5, 15)
    if (Sys_Is_Finite_Resource_Game()) then
      set value_change := value_change * 10000
    endif

    call Sys_Change_Planet_Value(planet_id, value_change, RESOURCE_TYPE_MINERALS)
    call Sys_Change_Planet_Value(planet_id, value_change, RESOURCE_TYPE_ORGANICS)
    call Sys_Change_Planet_Value(planet_id, value_change, RESOURCE_TYPE_RADIOACTIVES)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 17 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 17 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 17 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 17 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_PLANET_VALUE_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 18 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 18 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 18 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 18 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (planet_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_Population_Change
//------------------------------------------------------------------------
function Execute_Intel_Planet_Population_Change returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  planet_sys_loc:            long
  planet_sect_loc:           long
  planet_pop:                long
  pop_change:                long
  planet_name:               string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin
  // Get the target Empire's planet details
  if (planet_id > 0) then
    set planet_sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set planet_sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)
    set planet_pop := Sys_Get_Planet_Population(planet_id)

    // Reduce the target Empire's planet population - but don't leave 0 population
    set pop_change := Sys_Get_Random_Long(10, 50)
    if (pop_change > planet_pop) then
      set pop_change := planet_pop - 5
    endif

    // Reduce the target Empire's population
    call Sys_Change_Planet_Population(planet_id, -pop_change)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 19 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 19 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 19 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 19 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%Amount%]", Sys_Convert_Long_To_String(pop_change), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(planet_sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(planet_sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, planet_sys_loc, planet_sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_PLANET_POP_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 20 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 20 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 20 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 20 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%Amount%]", Sys_Convert_Long_To_String(pop_change), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(planet_sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(planet_sect_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, planet_sys_loc, planet_sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (planet_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_Population_Happiness_Change
//------------------------------------------------------------------------
function Execute_Intel_Planet_Population_Happiness_Change returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  happiness_change:          long
  planet_name:               string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's planet details
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Change the target Empire's planet happiness
    if (Sys_Is_Planet_Effected_By_Happiness(planet_id)) then
      set happiness_change := Sys_Get_Random_Long(10, 30)
      call Sys_Change_Planet_Population_Happiness(planet_id, happiness_change)

      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SABOTAGE_BY_US
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 21 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 21 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 21 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 21 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_PLANET_POP_ANGER_CHANGE
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 22 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 22 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 22 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 22 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
      call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endif
  endif

  return (planet_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_Population_Riot
//------------------------------------------------------------------------
function Execute_Intel_Planet_Population_Riot returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  planet_name:               string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the target Empire's planet details
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Set the target Empire's planet population to riot
    if (Sys_Is_Planet_Effected_By_Happiness(planet_id)) then
      call Sys_Set_Planet_Population_To_Riot(planet_id)

      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SABOTAGE_BY_US
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 23 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 23 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 23 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 23 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_PLANET_POP_RIOTING
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 24 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 24 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 24 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 24 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
      call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endif
  endif

  return (planet_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_Population_Rebel
//------------------------------------------------------------------------
function Execute_Intel_Planet_Population_Rebel returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  planet_name:               string
  planet_happiness:          long
  planet_can_rebel:          boolean := FALSE
  cargo_item_count:          long
  cargo_item_index:          long
  cargo_item_id:             long
  cargo_item_unit_type:      string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // The target Empire's planet will only rebel if it's happiness is low
  if (planet_id > 0) then
    set planet_happiness := Sys_Get_Planet_Happiness(planet_id)
    if (planet_happiness < 30) then
      set planet_can_rebel := TRUE
    endif
  endif

  // If the target Empire's planet can rebel, then change it's ownership to the source Empire
  if (planet_can_rebel) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Transfer the target Empire's planet ownership to the source Empire
    if (Sys_Is_Planet_Effected_By_Happiness(planet_id)) then

      // Remove all unit cargo
      set cargo_item_count := Sys_Get_Space_Object_Cargo_Item_Count(planet_id)
      // Go through the planet's cargo list, scrapping any item that is a unit
      if (cargo_item_count > 0) then
        loop
          set cargo_item_index := cargo_item_index + 1
          set cargo_item_id := Sys_Get_Space_Object_Cargo_Item_ID(planet_id, cargo_item_index)
          set cargo_item_unit_type := Sys_Get_Space_Object_Cargo_Item_Unit_Type(planet_id, cargo_item_id)
          // Only scrap items that are units
          if (cargo_item_unit_type <> "") then
            call Sys_Space_Object_Scrap_Cargo(planet_id, cargo_item_id)
          endif
          exitwhen (cargo_item_index <= 0) or (cargo_item_index >= cargo_item_count)
        endloop
      endif

      // Set the planet's new ownership
      call Sys_Space_Object_Set_To_New_Owner(planet_id, src_plr)

      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SABOTAGE_BY_US
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 25 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 25 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 25 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 25 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_PLANET_POP_REBEL
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 26 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 26 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 26 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 26 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
      call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endif
  endif

  return (planet_can_rebel)
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_Cargo_Damage
//------------------------------------------------------------------------
function Execute_Intel_Planet_Cargo_Damage returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  planet_name:               string
  planet_unit_space:         long
  dmg_amount:                long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Determine the amount of damage to inflict on the target Empire's planet cargo
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)
    set planet_unit_space := Sys_Get_Space_Object_Cargo_Space_Used_On_Type(planet_id, CARGO_ITEM_TYPE_UNIT, "")

    if (planet_unit_space < 1000) then
      set dmg_amount := planet_unit_space * Sys_Get_Random_Long(2, 4)
    else
      set dmg_amount := planet_unit_space * Sys_Get_Random_Long(2, 3)
    endif

    if (dmg_amount > 0) then
      call Sys_Space_Object_Take_Damage(planet_id, "Only Units in Cargo (Intel)", dmg_amount)

      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SABOTAGE_BY_US
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 27 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 27 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 27 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 27 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%DamageAmount%]", Sys_Convert_Long_To_String(Sys_Divide_Long(dmg_amount, 2)), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_PLANET_CARGO_DAMAGE
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 28 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 28 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 28 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 28 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%DamageAmount%]", Sys_Convert_Long_To_String(dmg_amount), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
      call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endif
  endif

  return (planet_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_Facility_Damage
//------------------------------------------------------------------------
function Execute_Intel_Planet_Facility_Damage returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  planet_name:               string
  planet_structure:          long
  has_spaceport:             boolean := FALSE
  has_spaceyard:             boolean := FALSE
  has_resupply_depot:        boolean := FALSE
  dmg_amount:                long
  dmg_description:           string
  dmg_applied:               boolean := FALSE
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Determine the amount of damage to inflict on the target Empire's planet cargo
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)
    set planet_structure := Sys_Get_Space_Object_Total_Tonnage_Structure(planet_id)
    set has_spaceport := (Sys_Get_Space_Object_Cargo_Facility_Tonnage_Space_Used(planet_id, Sys_Get_Facility_ID("Space Port")) > 0)
    set has_spaceyard := (Sys_Get_Space_Object_Cargo_Facility_Tonnage_Space_Used(planet_id, Sys_Get_Facility_ID("Space Yard Facility")) > 0) or (Sys_Get_Space_Object_Cargo_Facility_Tonnage_Space_Used(planet_id, Sys_Get_Facility_ID("Temporal Space Yard Facility")) > 0)
    set has_resupply_depot := (Sys_Get_Space_Object_Cargo_Facility_Tonnage_Space_Used(planet_id, Sys_Get_Facility_ID("Resupply Depot")) > 0)

    // Hit high value targets if possible
    // Spaceport
    if (has_spaceport) then
      if (Sys_Get_Random_Long(1, 2) = 1) then
        set dmg_amount := 2000
        call Sys_Space_Object_Take_Damage(planet_id, "Only Spaceports (Intel)", dmg_amount)
        set dmg_description := "The Spaceport was completely destroyed."
      endif
    endif
    // Space Yard
    if (has_spaceyard) and (dmg_amount = 0) then
      if (Sys_Get_Random_Long(1, 2) = 1) then
        set dmg_amount := 2000
        set dmg_applied := Sys_Space_Object_Take_Damage(planet_id, "Only Space Yards (Intel)", dmg_amount)
        set dmg_description := "The Space Yard was completely destroyed."
      endif
    endif
    // Resupply Depots
    if (has_resupply_depot) and (dmg_amount = 0) then
      if (Sys_Get_Random_Long(1, 2) = 1) then
        set dmg_amount := 2000
        set dmg_applied := Sys_Space_Object_Take_Damage(planet_id, "Only Resupply Depots (Intel)", dmg_amount)
        set dmg_description := "A Resupply Depot was completely destroyed."
      endif
    endif
    // Other facilities
    if (dmg_amount = 0) then
      set dmg_amount := Sys_Get_Random_Long(2500, 3000)
      set dmg_applied := Sys_Space_Object_Take_Damage(planet_id, "Only Facilities (Intel)", dmg_amount)
      set dmg_description := "At least one facility was destroyed and others may be damaged."
    endif

    if (dmg_applied) then

      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SABOTAGE_BY_US
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 80 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 80 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 80 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 80 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%DamageDescription%]", dmg_description, TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_PLANET_CARGO_DAMAGE
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 81 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 81 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 81 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 81 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%DamageDescription%]", dmg_description, TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
      call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endif
  endif

  return (planet_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Disrupt_Construction_Queue
//------------------------------------------------------------------------
function Execute_Intel_Disrupt_Construction_Queue returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  planet_name:               string
  lst_queue_items:           longlist
  queue_item_id:             long
  queue_item_type:           long
  queue_item_design_id:      long
  queue_item_facility_id:    long
  queue_item_name:           string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
  queue_deleted:             boolean := FALSE
begin

  // Delete the current item in the selected construction queue
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    call Sys_Get_Construction_Queue_Items_List(planet_id, lst_queue_items)

    if (lst_queue_items.count() > 0) then
      set queue_item_id := lst_queue_items.get(1)
      set queue_item_type := Sys_Get_Construction_Queue_Item_Type(planet_id, queue_item_id)

      case queue_item_type
        CONSTRUCTION_ITEM_TYPE_VEHICLE_DESIGN:
          set queue_item_design_id := Sys_Get_Construction_Queue_Item_Design_ID(planet_id, queue_item_id)
          set queue_item_name := Sys_Get_Vehicle_Design_Name(queue_item_design_id)
        CONSTRUCTION_ITEM_TYPE_FACILITY:
          set queue_item_id := Sys_Get_Construction_Queue_Item_Facility_ID(planet_id, queue_item_id)
          set queue_item_name := Sys_Get_Facility_Name(queue_item_id)
      endcase

      call Sys_Debug_Print("Intel", "    - Attempt to disrupt construction queue")

      set queue_deleted := Sys_Delete_Construction_Queue_Item(planet_id, queue_item_id)

      if queue_deleted then
        // --- Log Message to Source Player --------------------------------------------------------------
        set log_type := LOG_TYPE_SABOTAGE_BY_US
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 70 Title")
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 70 Text")
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 70 Small Picture Filename")
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 70 Large Picture Filename")

        set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
        set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
        set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
        set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
        set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
        set message_text := Sys_Replace_String(message_text, "[%QueueItemName%]", queue_item_name, TRUE, TRUE)

        set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
        set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
        set plr_caused := 0

        call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

        // --- Log Message to Target Player --------------------------------------------------------------
        set log_type := LOG_TYPE_SABOTAGE_AGAINST_US
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 71 Title")
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 71 Text")
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 71 Small Picture Filename")
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 71 Large Picture Filename")

        set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
        set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
        set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
        set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
        set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
        set message_text := Sys_Replace_String(message_text, "[%QueueItemName%]", queue_item_name, TRUE, TRUE)

        set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
        set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
        set plr_caused := 0

        call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
        call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
      endif
    endif
  endif

  return queue_deleted
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_Plague_Created
//------------------------------------------------------------------------
function Execute_Intel_Planet_Plague_Created returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  planet_name:               string
  plague_level:              long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Set the plague level
    set plague_level := Sys_Get_Random_Long(1, 3)

    if (plague_level > 0) then
      call Sys_Set_Planet_Plague_Level(planet_id, plague_level)

      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_SABOTAGE_BY_US
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 29 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 29 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 29 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 29 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_PLANET_PLAGUED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 30 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 30 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 30 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 30 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
      call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endif
  endif

  return (planet_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Points_Change
//------------------------------------------------------------------------
function Execute_Intel_Empire_Points_Change returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  min_amt:                   long
  org_amt:                   long
  rad_amt:                   long
  trg_min_amt:               long
  trg_org_amt:               long
  trg_rad_amt:               long
  max_adj_min:               long
  max_adj_org:               long
  max_adj_rad:               long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin
  // Determine the amount of the target Empire's resources to destroy
  if (trg_plr > 0) then
    // How many resources does the target empire have?
    set trg_min_amt := Sys_Get_Empire_Current_Points(trg_plr, POINT_TYPE_MINERALS)
    set trg_org_amt := Sys_Get_Empire_Current_Points(trg_plr, POINT_TYPE_ORGANICS)
    set trg_rad_amt := Sys_Get_Empire_Current_Points(trg_plr, POINT_TYPE_RADIOACTIVES)
    // Set a max amount for disruption (10%)
    set max_adj_min := Sys_Divide_Long(trg_min_amt, 10)
    set max_adj_org := Sys_Divide_Long(trg_org_amt, 10)
    set max_adj_rad := Sys_Divide_Long(trg_rad_amt, 10)
    // Determine the disruption amount
    set min_amt := Sys_Get_Random_Long(1000, max_adj_min)
    set org_amt := Sys_Get_Random_Long(1000, max_adj_org)
    set rad_amt := Sys_Get_Random_Long(1000, max_adj_rad)
    // Don't destroy more resources than the target Empire has
    if (max_adj_min < 1000) then
      set min_amt := 0
    endif
    if (max_adj_org < 1000) then
      set org_amt := 0
    endif
    if (max_adj_rad < 1000) then
      set rad_amt := 0
    endif

    // Change the target Empire's resource amounts
    call Sys_Change_Empire_Points(trg_plr, -min_amt, -org_amt, -rad_amt)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 31 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 31 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 31 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 31 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%MineralsAmount%]", Sys_Convert_Long_To_String(min_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OrganicsAmount%]", Sys_Convert_Long_To_String(org_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%RadioactivesAmount%]", Sys_Convert_Long_To_String(rad_amt), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_POINTS_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 32 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 32 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 32 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 32 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%MineralsAmount%]", Sys_Convert_Long_To_String(min_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OrganicsAmount%]", Sys_Convert_Long_To_String(org_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%RadioactivesAmount%]", Sys_Convert_Long_To_String(rad_amt), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (trg_plr > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Fleet_Concentrations
//------------------------------------------------------------------------
function Execute_Intel_Fleet_Concentrations returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  loop_count:                long
  fleet_count:               long
  fleet_id:                  long
  fleet_found:               boolean := FALSE
  num_ships:                 long
  fleet_sys_loc:             long
  fleet_sect_loc:            long
  fleet_leader_id:           long
  fleet_current_order:       long
  fleet_order_sys:           long
  order_description:         string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the number of the target player's fleets
  set fleet_count := Sys_Get_Empire_Fleet_Count(trg_plr)
  
  if (fleet_count > 0) then
    loop
      set loop_count := loop_count + 1
      // Pick a random fleet to report
      set fleet_id := Sys_Get_Random_Long(1, fleet_count)
      // Get the fleet's details
      if (fleet_id > 0) then
        set fleet_sys_loc := Sys_Get_Empire_Fleet_System_Location(trg_plr, fleet_id)
        set fleet_sect_loc := Sys_Get_Empire_Fleet_Sector_Location(trg_plr, fleet_id)
        set num_ships := Sys_Get_Empire_Fleet_Ship_Count(trg_plr, fleet_id)
        set fleet_found := (num_ships > 0)
      endif
      exitwhen (fleet_found) or (loop_count > 10)
    endloop
  endif

  if (fleet_found) then
    // Don't allow this project to be executed twice in a turn against the same player
    set bool_Skip_Intel_Event_Fleet_Concentrations := TRUE
    // Provide some extra details
    if (Sys_Get_Empire_Fleet_Order_Count(trg_plr, fleet_id) > 0) then
      set fleet_leader_id := Sys_Get_Empire_Fleet_Leader(trg_plr, fleet_id)
      set fleet_current_order := Sys_Get_Space_Object_Order_Type(fleet_leader_id, 1)
      // Describe the current order...
      case fleet_current_order
        ORDER_MOVETO:
          set fleet_order_sys := Sys_Get_Space_Object_Order_System_Location(fleet_leader_id, 1)
          set order_description := "The fleet appears to be moving to a destination in the " + Sys_Get_Solar_System_Name(fleet_order_sys) + " system."
        ORDER_ATTACK_MOVE:
          set fleet_order_sys := Sys_Get_Space_Object_Order_System_Location(fleet_leader_id, 1)
          set order_description := "The fleet appears to be moving to an attack location in the " + Sys_Get_Solar_System_Name(fleet_order_sys) + " system."
        :
          set order_description := "The fleet's orders could not be determined."
      endcase
    else
      // If no orders...
      set order_description := "The fleet appears to be stationary with no active orders."
    endif

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 78 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 78 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 78 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 78 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%Amount%]", Sys_Convert_Long_To_String(num_ships), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(fleet_sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%Speculation%]", order_description, TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := trg_plr

    call Sys_Add_Empire_Log_Entry(src_plr, fleet_sys_loc, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 79 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 79 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 79 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 79 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%Amount%]", Sys_Convert_Long_To_String(num_ships), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(fleet_sys_loc), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, fleet_sys_loc, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (fleet_found)
end

//------------------------------------------------------------------------
// Execute_Intel_Ship_Concentrations
//------------------------------------------------------------------------
function Execute_Intel_Ship_Concentrations returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  system_count:              long
  index:                     long
  num_ships:                 long
  max_ships:                 long
  max_sys:                   long
  max_ships2:                long
  max_sys2:                  long
  max_ships3:                long
  max_sys3:                  long
  sys_id:                    long
  num_ships:                 long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get number of systems
  set system_count := Sys_Get_Number_Of_Solar_Systems()

  // Determine how many ships the target Empire has in the selected system
  for index := 1 to system_count do
    if (Sys_Have_Seen_System(trg_plr, index)) then
      set num_ships := Sys_Get_Number_Of_Player_Ships_In_System(trg_plr, index)
      if (num_ships > max_ships) then
        set max_ships3 := max_ships2
        set max_sys3 := max_sys2
        set max_ships2 := max_ships
        set max_sys2 := max_sys
        set max_ships := num_ships
        set max_sys := index
      endif
    endif
  endfor

  // Pick randomly from the top 3
  if (max_sys > 0) then
    case Sys_Get_Random_Long(1, 3)
      1:
        set sys_id := max_sys
        set num_ships := max_ships
      2:
        set sys_id := max_sys2
        set num_ships := max_ships2
      3:
        set sys_id := max_sys3
        set num_ships := max_ships3
    endcase
  endif

  // Default if other systems don't work
  if (sys_id = 0) then
    set sys_id := max_sys
    set num_ships := max_ships
 endif

  if (sys_id > 0) then
    // Don't allow this project to be executed twice in a turn against the same player
    set bool_Skip_Intel_Event_Ship_Concentrations := TRUE

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 35 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 35 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 35 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 35 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%Amount%]", Sys_Convert_Long_To_String(num_ships), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := trg_plr

    call Sys_Add_Empire_Log_Entry(src_plr, sys_id, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 36 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 36 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 36 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 36 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%Amount%]", Sys_Convert_Long_To_String(num_ships), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, sys_id, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (sys_id > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Ship_Construction_Information
//------------------------------------------------------------------------
function Execute_Intel_Ship_Construction_Information returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  system_count:              long
  index:                     long
  num_queues:                long
  max_queues:                long
  max_queues2:               long
  max_queues3:               long
  max_sys:                   long
  max_sys2:                  long
  max_sys3:                  long
  sys_id:                    long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get number of systems to check
  set system_count := Sys_Get_Number_Of_Solar_Systems()
  set max_queues := 0
  set max_sys := 0

  // Get a list of the target Empire's construction queues
  for index := 1 to system_count do
    if (Sys_Have_Seen_System(trg_plr, index)) then
      set num_queues := Sys_Get_Number_Of_Player_Construction_Queues_In_System(trg_plr, index)
      if (num_queues > max_queues) then
        set max_queues3 := max_queues2
        set max_sys3 := max_sys2
        set max_queues2 := max_queues
        set max_sys2 := max_sys
        set max_queues := num_queues
        set max_sys := index
      endif
    endif
  endfor

  // Pick randomly from the top 3
  if (max_sys > 0) then
    case Sys_Get_Random_Long(1, 3)
      1:
        set sys_id := max_sys
        set num_queues := max_queues
      2:
        set sys_id := max_sys2
        set num_queues := max_queues2
      3:
        set sys_id := max_sys3
        set num_queues := max_queues3
    endcase
  endif

  // Default if other systems don't work
  if (sys_id = 0) then
    set sys_id := max_sys
    set num_queues := max_queues
 endif

  if (sys_id > 0) then
    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 37 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 37 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 37 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 37 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%Amount%]", Sys_Convert_Long_To_String(num_queues), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := trg_plr

    call Sys_Add_Empire_Log_Entry(src_plr, sys_id, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 38 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 38 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 38 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 38 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%Amount%]", Sys_Convert_Long_To_String(num_queues), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, sys_id, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (max_sys > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Ship_Designs_Steal
//------------------------------------------------------------------------
function Execute_Intel_Ship_Designs_Steal returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  design_count:              long
  index:                     long
  design_id:                 long
  design_list:               longlist
  pick:                      long
  design_name:               string
  design_size_name:          string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the number of designs
  set design_count := Sys_Get_Player_Designs_Count(trg_plr)

  // Make a list of all the designs that the target Empire is using
  if (design_count > 0) then
    for index := 1 to design_count do
      set design_id := Sys_Get_Player_Design_ID(trg_plr, index)
      if (not Sys_Is_Vehicle_Design_Unit(design_id)) then
        if (Sys_Has_Vehicle_Design_Been_Used(design_id)) then
          if (Sys_Get_Vehicle_Design_Date_Last_Seen(design_id, src_plr) = 0) then
            call design_list.add(design_id)
          endif
        endif
      endif
    endfor
  endif

  // Choose one of the designs to steal from the Target Empire
  set design_count := design_list.count()

  if (design_count > 0) then
    set pick := Sys_Get_Random_Long(1, design_count)
    set design_id := design_list.Get(pick)
    set design_name := Sys_Get_Vehicle_Design_Name(design_id)
    set design_size_name := Sys_Get_Vehicle_Design_Size_Name(design_id)
    call Sys_Set_Vehicle_Design_Date_Last_Seen(design_id, src_plr, sys_long_Game_Date)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 39 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 39 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 39 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 39 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%DesignName%]", design_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%DesignSizeName%]", design_size_name, TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := trg_plr

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 40 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 40 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 40 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 40 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%DesignName%]", design_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%DesignSizeName%]", design_size_name, TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (design_count > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_Information
//------------------------------------------------------------------------
function Execute_Intel_Planet_Information returns boolean
params
  planet_id:                 long
  src_plr:                   long
  trg_plr:                   long
vars
  sys_loc:                   long
  sect_loc:                  long
  planet_name:               string
  res_val:                   resources
  pop_amt:                   long
  facil_amt:                 long
  weap_plat_amt:             long
  fighter_amt:               long
  troop_amt:                 long
  index:                     long
  cargo_count:               long
  cargo_id:                  long
  cargo_item_type:           long
  cargo_unit_type:           string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get stats from the target Empire's planet
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)
    set res_val := Sys_Get_Space_Object_Planet_Value(planet_id)
    set pop_amt := Sys_Get_Planet_Population(planet_id)

    set facil_amt := 0
    set weap_plat_amt := 0
    set fighter_amt := 0
    set troop_amt := 0

    set cargo_count := Sys_Get_Space_Object_Cargo_Item_Count(planet_id)
    if (cargo_count > 0) then
      for index := 1 to cargo_count do
        set cargo_id := Sys_Get_Space_Object_Cargo_Item_ID(planet_id, index)
        set cargo_item_type := Sys_Get_Space_Object_Cargo_Item_Type(planet_id, cargo_id)
        set cargo_unit_type := Sys_Get_Space_Object_Cargo_Item_Unit_Type(planet_id, cargo_id)
        case (cargo_item_type) 
          CARGO_ITEM_TYPE_FACILITY:
            set facil_amt := facil_amt + 1
          CARGO_ITEM_TYPE_UNIT:
            case (cargo_unit_type)
              "Fighter":
                set fighter_amt := fighter_amt + 1
              "Troop":
                set troop_amt := troop_amt + 1
              "Weapon Platform":
                set weap_plat_amt := weap_plat_amt + 1
            endcase
        endcase
      endfor
    endif

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 41 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 41 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 41 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 41 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%MineralsAmount%]", Sys_Convert_Real_To_String(res_val.Get(RESOURCE_TYPE_MINERALS)), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OrganicsAmount%]", Sys_Convert_Real_To_String(res_val.Get(RESOURCE_TYPE_ORGANICS)), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%RadioactivesAmount%]", Sys_Convert_Real_To_String(res_val.Get(RESOURCE_TYPE_RADIOACTIVES)), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%PopulationAmount%]", Sys_Convert_Long_To_String(pop_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%FacilityAmount%]", Sys_Convert_Long_To_String(facil_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%WeaponPlatformAmount%]", Sys_Convert_Long_To_String(weap_plat_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%FighterAmount%]", Sys_Convert_Long_To_String(fighter_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TroopAmount%]", Sys_Convert_Long_To_String(troop_amt), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := trg_plr

    call Sys_Add_Empire_Log_Entry(src_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 42 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 42 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 42 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 42 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%PlanetName%]", planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SectorLoc%]", Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%MineralsAmount%]", Sys_Convert_Real_To_String(res_val.Get(RESOURCE_TYPE_MINERALS)), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OrganicsAmount%]", Sys_Convert_Real_To_String(res_val.Get(RESOURCE_TYPE_ORGANICS)), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%RadioactivesAmount%]", Sys_Convert_Real_To_String(res_val.Get(RESOURCE_TYPE_RADIOACTIVES)), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%PopulationAmount%]", Sys_Convert_Long_To_String(pop_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%FacilityAmount%]", Sys_Convert_Long_To_String(facil_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%WeaponPlatformAmount%]", Sys_Convert_Long_To_String(weap_plat_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%FighterAmount%]", Sys_Convert_Long_To_String(fighter_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TroopAmount%]", Sys_Convert_Long_To_String(troop_amt), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (planet_id)
end

//------------------------------------------------------------------------
// Execute_Intel_Planet_Locations
//------------------------------------------------------------------------
function Execute_Intel_Planet_Locations returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  num_systems:               long
  num_planets:               long
  total_pop:                 long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Collect planet locations and statistics from the target Empire
  set num_systems := Sys_AI_Empire_Stats_Get_Colonies_Statistics(trg_plr, 1)
  set num_planets := Sys_AI_Empire_Stats_Get_Colonies_Statistics(trg_plr, 2)
  set total_pop := Sys_AI_Empire_Stats_Get_Colonies_Statistics(trg_plr, 5)

  // Don't allow this project to be executed twice in a turn against the same player
  set bool_Skip_Intel_Event_Planet_Locations := TRUE

  // --- Log Message to Source Player --------------------------------------------------------------
  set log_type := LOG_TYPE_ESPIONAGE_BY_US
  set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 43 Title")
  set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 43 Text")
  set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 43 Small Picture Filename")
  set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 43 Large Picture Filename")

  set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%NumSystems%]", Sys_Convert_Long_To_String(num_systems), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%NumColonies%]", Sys_Convert_Long_To_String(num_planets), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%PopulationAmount%]", Sys_Convert_Long_To_String(total_pop), TRUE, TRUE)

  set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
  set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
  set plr_caused := trg_plr

  call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

  // --- Log Message to Target Player --------------------------------------------------------------
  set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
  set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 44 Title")
  set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 44 Text")
  set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 44 Small Picture Filename")
  set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 44 Large Picture Filename")

  set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%NumSystems%]", Sys_Convert_Long_To_String(num_systems), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%NumColonies%]", Sys_Convert_Long_To_String(num_planets), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%PopulationAmount%]", Sys_Convert_Long_To_String(total_pop), TRUE, TRUE)

  set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
  set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
  set plr_caused := 0

  call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
  call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

  return TRUE
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Points_Steal
//------------------------------------------------------------------------
function Execute_Intel_Empire_Points_Steal returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  min_amt:                   long
  org_amt:                   long
  rad_amt:                   long
  max_min_amt:               long
  max_org_amt:               long
  max_rad_amt:               long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Determine the amount of points to steal from the target Empire
  if (trg_plr > 0) then
    set min_amt := Sys_Get_Random_Long(1000, 5000)
    set org_amt := Sys_Get_Random_Long(1000, 5000)
    set rad_amt := Sys_Get_Random_Long(1000, 5000)

    set max_min_amt := Sys_Get_Empire_Current_Points(trg_plr, POINT_TYPE_MINERALS)
    set max_org_amt := Sys_Get_Empire_Current_Points(trg_plr, POINT_TYPE_ORGANICS)
    set max_rad_amt := Sys_Get_Empire_Current_Points(trg_plr, POINT_TYPE_RADIOACTIVES)

    // Don't steal more resources then the target Empire has
    if (min_amt > max_min_amt) then
      set min_amt := max_min_amt
    endif
    if (org_amt > max_org_amt) then
      set org_amt := max_org_amt
    endif
    if (rad_amt > max_rad_amt) then
      set rad_amt := max_rad_amt
    endif

    // Adjust the resource amounts for our Empire and the target Empire
    call Sys_Change_Empire_Points(trg_plr, -min_amt, -org_amt, -rad_amt)
    call Sys_Change_Empire_Points(src_plr, min_amt, org_amt, rad_amt)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 45 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 45 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 45 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 45 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%MineralsAmount%]", Sys_Convert_Long_To_String(min_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OrganicsAmount%]", Sys_Convert_Long_To_String(org_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%RadioactivesAmount%]", Sys_Convert_Long_To_String(rad_amt), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_POINTS_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 46 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 46 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 46 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 46 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%MineralsAmount%]", Sys_Convert_Long_To_String(min_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OrganicsAmount%]", Sys_Convert_Long_To_String(org_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%RadioactivesAmount%]", Sys_Convert_Long_To_String(rad_amt), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (trg_plr > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Research_Steal
//------------------------------------------------------------------------
function Execute_Intel_Empire_Research_Steal returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  tech_count:                long
  pick:                      long
  index:                     long
  tech_id:                   long
  tech_level:                long
  our_tech_level:            long
  tech_level_diff:           long
  tech_area_list:            longlist
  tech_name:                 string
  accumulated_pts:           real
  tech_cost:                 real
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Find a tech area that they have, that we don't
  set tech_count := Sys_Get_Tech_Area_Count()

  // Create a list of the more advanced tech areas that the target Empire has researched
  if (tech_count > 0) then
    for index := 1 to tech_count do
      set tech_id := Sys_Get_Tech_By_Index(index)
      set tech_level := Sys_Get_Empire_Research_Tech_Level(trg_plr, tech_id)
      set our_tech_level := Sys_Get_Empire_Research_Tech_Level(src_plr, tech_id)
      if (tech_level > 0) and (tech_level > our_tech_level) then
        if (Sys_Is_Empire_Research_Tech_Visible(src_plr, tech_id)) then
          call tech_area_list.add(tech_id)
        endif
      endif
    endfor
  endif

  // Pick one of the target Empire's tech areas to steal
  set tech_count := tech_area_list.count()

  if (tech_count > 0) then
    set pick := Sys_Get_Random_Long(1, tech_count)
    set tech_id := tech_area_list.get(pick)
    set tech_level := Sys_Get_Empire_Research_Tech_Level(trg_plr, tech_id)
    set our_tech_level := Sys_Get_Empire_Research_Tech_Level(src_plr, tech_id)
    set tech_level_diff := tech_level - our_tech_level
    set tech_name := Sys_Get_Tech_Area_Name(tech_id)
    set tech_cost := Sys_Get_Empire_Research_Tech_Area_Cost_For_Next_Level(src_plr, tech_id)

    // Adjust amount of research stolen based on the difference in tech cost
    set accumulated_pts := Sys_Get_Random_Long(1, 8) * 10 * tech_cost / 100

    // Only allow up to 1 tech level to be obtained
    if (accumulated_pts > tech_cost) then
      set accumulated_pts := tech_cost
    endif

    // Change our research level in the stolen tech area
    call Sys_Change_Empire_Research_Tech_Area_Accomplished_Amount(src_plr, tech_id, accumulated_pts)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 47 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 47 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 47 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 47 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechName%]", tech_name, TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := trg_plr

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 48 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 48 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 48 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 48 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechName%]", tech_name, TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (tech_count > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Research_Project_Delete
//------------------------------------------------------------------------
function Execute_Intel_Empire_Research_Project_Delete returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  tech_count:                long
  index:                     long
  tech_id:                   long
  tech_spending:             long
  tech_progress:             real
  tech_pct_lost:             long
  tech_pts_lost:             real
  tech_area_list:            longlist
  pick:                      long
  tech_name:                 string
  effect_amt:                string
  pts_lost:                  string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the total number of tech areas
  set tech_count := Sys_Get_Tech_Area_Count()

  // Create a list of the target Empire's research areas
  if (tech_count > 0) then
    for index := 1 to tech_count do
      set tech_id := Sys_Get_Tech_By_Index(index)
      set tech_spending := Sys_Get_Empire_Research_Tech_Area_Spending_Pct(trg_plr, tech_id)
      set tech_progress := Sys_Get_Empire_Research_Tech_Area_Accumulated_Points(trg_plr, tech_id)
      // Choose an active research area with accumulated research
      if (tech_spending > 0) and (tech_progress > 0) then
        call tech_area_list.add(tech_id)
      endif
    endfor
  endif

  // Pick one of target Empire's tech areas to reduce the accumulated research points
  set tech_count := tech_area_list.count()

  if (tech_count > 0) then
    set pick := Sys_Get_Random_Long(1, tech_count)
    set tech_id := tech_area_list.get(pick)
    set tech_name := Sys_Get_Tech_Area_Name(tech_id)
    set tech_progress := Sys_Get_Empire_Research_Tech_Area_Accumulated_Points(trg_plr, tech_id)
    set tech_pct_lost := Sys_Get_Random_Long(1, 3) * 25
    set tech_pts_lost := tech_progress * tech_pct_lost / 100
    set effect_amt := Sys_Convert_Long_To_String(tech_pct_lost)

    call Sys_Change_Empire_Research_Tech_Area_Accomplished_Amount(trg_plr, tech_id, -tech_pts_lost)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 49 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 49 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 49 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 49 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechName%]", tech_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%EffectAmount%]", effect_amt, TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 50 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 50 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 50 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 50 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechName%]", tech_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%EffectAmount%]", effect_amt, TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (tech_count > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Intelligence_Project_Delete
//------------------------------------------------------------------------
function Execute_Intel_Empire_Intelligence_Project_Delete returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  plr_count:                 long
  index:                     long
  plr_id:                    long
  spending_pct:              long
  new_spending_pct:          long
  plr_list:                  longlist
  pick:                      long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get number of players
  set plr_count := Sys_Get_Number_Of_Players()

  // Create a list of intel spending by the target Empire against other Empires
  if (plr_count > 0) then
    for index := 1 to plr_count do
      set spending_pct := Sys_Get_Empire_Intelligence_Spending_Against_Player(trg_plr, index)
      if (spending_pct > 0) then
        call plr_list.add(index)
      endif
    endfor
  endif

  // Pick one of the target Empire's intel targets to disrupt
  set plr_count := plr_list.count()

  if (plr_count > 0) then
    set pick := Sys_Get_Random_Long(1, plr_count)
    set plr_id := plr_list.get(pick)
    set spending_pct := Sys_Get_Empire_Intelligence_Spending_Against_Player(trg_plr, pick)
    set new_spending_pct := Sys_Get_Random_Long(spending_pct - 25, spending_pct - 5)

    if (new_spending_pct < 0) then
      set new_spending_pct := 0
    endif

    // Reduce the target Empire's intel spending
    call Sys_Set_Empire_Intelligence_Offense_Accumulated(trg_plr, plr_id, new_spending_pct)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 51 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 51 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 51 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 51 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OtherEmpireName%]", Sys_Empire_Get_Empire_Name(plr_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 52 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 52 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 52 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 52 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OtherEmpireName%]", Sys_Empire_Get_Empire_Name(plr_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (plr_count > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Politics_Disrupt_Trade
//------------------------------------------------------------------------
function Execute_Intel_Empire_Politics_Disrupt_Trade returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  plr_count:                 long
  index:                     long
  trade_pct:                 real
  treaty_time:               long
  plr_list:                  longlist
  plr_id:                    long
  pick:                      long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get player count
  set plr_count := Sys_Get_Number_Of_Players()

  // Create a list of the target's Empire's trade treaties
  if (plr_count > 0) then
    for index := 1 to plr_count do
      if (index <> sys_long_Player_ID) then
        set trade_pct := Sys_Empire_Politics_Get_Trade_Percent_With_Player(trg_plr, index)
        set treaty_time := Sys_Empire_Politics_Get_Status_Time_With_Player(trg_plr, index)
        if (trade_pct > 0) and (treaty_time > 0) then
          call plr_list.add(index)
        endif
      endif
    endfor
  endif

  // Pick one of the target Empire's treaties to reset
  set plr_count := plr_list.count()

  if (plr_count > 0) then
    set pick := Sys_Get_Random_Long(1, plr_count)
    set plr_id := plr_list.get(pick)

    // Clear trade between the two other Empires
    call Sys_Empire_Politics_Clear_Treaty_Time_With_Player(trg_plr, plr_id)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 53 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 53 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 53 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 53 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OtherEmpireName%]", Sys_Empire_Get_Empire_Name(plr_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 54 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 54 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 54 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 54 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OtherEmpireName%]", Sys_Empire_Get_Empire_Name(plr_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (plr_count > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Politics_Intercept_Message
//------------------------------------------------------------------------
function Execute_Intel_Empire_Politics_Intercept_Message returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  plr_count:                 long
  index:                     long
  msg_text:                  string
  plr_id:                    long
  pick:                      long
  from_plr:                  long
  to_plr:                    long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
  plr_list:                  longlist
begin

  // Get the number of players
  set plr_count := Sys_Get_Number_Of_Players()

  // Create a list of messages being sent to the target Empire
  if (plr_count > 0) then
    for index := 1 to plr_count do
      if (index <> sys_long_Player_ID) then
        set msg_text := Sys_Empire_Politics_Get_Message_Text_From_Plr(trg_plr, index)
        if (Sys_Length_String(msg_text) > 0) then
          call plr_list.add(index)
        endif
        set msg_text := Sys_Empire_Politics_Get_Message_Text_From_Plr(index, trg_plr)
        if (Sys_Length_String(msg_text) > 0) then
          call plr_list.add(index)
        endif
      endif
    endfor
  endif

  // Pick one of the target Empire's messages to intercept
  set plr_count := plr_list.count()

  if (plr_count > 0) then
    set pick := Sys_Get_Random_Long(1, plr_count)
    set plr_id := plr_list.get(pick)
    set from_plr := 0
    set to_plr := 0

    set msg_text := Sys_Empire_Politics_Get_Message_Text_From_Plr(trg_plr, plr_id)
    if (Sys_Length_String(msg_text) > 0) then
      set from_plr := trg_plr
      set to_plr := plr_id
    else 
      set msg_text := Sys_Empire_Politics_Get_Message_Text_From_Plr(index, trg_plr)
      if (Sys_Length_String(msg_text) > 0) then
        set from_plr := plr_id
        set to_plr := trg_plr
      endif
    endif

    if (from_plr > 0) and (to_plr > 0) then
      // --- Log Message to Source Player --------------------------------------------------------------
      set log_type := LOG_TYPE_ESPIONAGE_BY_US
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 55 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 55 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 55 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 55 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%OtherEmpireName%]", Sys_Empire_Get_Empire_Name(plr_id), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%FromEmpireName%]", Sys_Empire_Get_Empire_Name(from_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%ToEmpireName%]", Sys_Empire_Get_Empire_Name(to_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%MessageText%]", msg_text, TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := trg_plr

      call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

      // --- Log Message to Target Player --------------------------------------------------------------
      set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 56 Title")
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 56 Text")
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 56 Small Picture Filename")
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 56 Large Picture Filename")

      set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%OtherEmpireName%]", Sys_Empire_Get_Empire_Name(plr_id), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%FromEmpireName%]", Sys_Empire_Get_Empire_Name(from_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%ToEmpireName%]", Sys_Empire_Get_Empire_Name(to_plr), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, "[%MessageText%]", msg_text, TRUE, TRUE)

      set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
      set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
      set plr_caused := 0

      call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
      call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endif
  endif

  return (from_plr > 0 and to_plr > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Politics_Treaty_Information
//------------------------------------------------------------------------
function Execute_Intel_Empire_Politics_Treaty_Information returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  plr_count:                 long
  index:                     long
  plr_list:                  longlist
  plr_id:                    long
  pick:                      long
  treaty_name:               string
  elem_count:                long
  elem_index:                long
  lst_elem_type:             longlist
  lst_elem_value:            longlist
  elem_name:                 string
  elem_summary:              string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get the number of players
  set plr_count := Sys_Get_Number_Of_Players()

  // Create a list of all the other Empire's treaties
  if (plr_count > 0) then
    for index := 1 to plr_count do
      if (index <> sys_long_Player_ID) then
        if (Sys_Empire_Politics_Is_Player_Ally(trg_plr, index)) then
          call plr_list.add(index)
        endif
      endif
    endfor
  endif

  // Pick one of the target Empire's treaties to learn about
  set plr_count := plr_list.count()

  if (plr_count > 0) then
    set pick := Sys_Get_Random_Long(1, plr_count)
    set plr_id := plr_list.get(pick)

    // Return the name of the treaty between the other players
    set treaty_name := Sys_Empire_Politics_Get_Treaty_Name_Between_Players(trg_plr, plr_id)

    // Select some treaty elements
    call Sys_Get_Treaty_Elements_Between_Empires(trg_plr, plr_id, lst_elem_type, lst_elem_value)
    set elem_count := lst_elem_type.count()

    // Report some of the treaty elements
    if (elem_count > 0) then
      set elem_name := ""
      // Randomly select elements to report
      for elem_index := 1 to elem_count do
        if (Sys_Get_Random_Long(1, 2) = 1) then
          set elem_name := Get_Treaty_Element_Type_Name(lst_elem_type.get(elem_index))
          set elem_summary := elem_summary + elem_name + ", "
        endif
      endfor
    endif
    // Trim the list for reporting
    call Sys_Delete_String(elem_summary, Sys_Length_String(elem_summary) - 1, 1)
    set elem_summary := elem_summary + "."

    // Don't allow this project to be executed twice in a turn against the same player
    set bool_Skip_Intel_Event_Treaty_Info := TRUE

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 57 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 57 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 57 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 57 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OtherEmpireName%]", Sys_Empire_Get_Empire_Name(plr_id), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TreatyName%]", treaty_name, TRUE, TRUE)
    set message_text := message_text + " Some reported elements include " + elem_summary

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_SABOTAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 58 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 58 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 58 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 58 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OtherEmpireName%]", Sys_Empire_Get_Empire_Name(plr_id), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TreatyName%]", treaty_name, TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (plr_count > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Politics_Prevent_Messages
//------------------------------------------------------------------------
function Execute_Intel_Empire_Politics_Prevent_Messages returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  plr_count:                 long
  index:                     long
  msg_text:                  string
  plr_id:                    long
  pick:                      long
  msg_deleted:               boolean := FALSE
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
  plr_list:                  longlist
begin

  // Get the number of players
  set plr_count := Sys_Get_Number_Of_Players()

  // Make a list of the target Empire's messages
  if (plr_count > 0) then
    for index := 1 to plr_count do
      if (index <> src_plr) then
        set msg_text := Sys_Empire_Politics_Get_Message_Text_From_Plr(trg_plr, index)
        if (Sys_Length_String(msg_text) > 0) then
          call plr_list.add(index)
        endif
        set msg_text := Sys_Empire_Politics_Get_Message_Text_From_Plr(index, trg_plr)
        if (Sys_Length_String(msg_text) > 0) then
          call plr_list.add(index)
        endif
      endif
    endfor
  endif

  // Pick one of the target Empire's messages to delete
  set plr_count := plr_list.count()

  if (plr_count > 0) then
    set pick := Sys_Get_Random_Long(1, plr_count)
    set plr_id := plr_list.get(pick)

    set msg_deleted := Sys_Empire_Politics_Delete_Message_Between_Players(trg_plr, plr_id)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 59 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 59 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 59 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 59 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OtherEmpireName%]", Sys_Empire_Get_Empire_Name(plr_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := trg_plr

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
   
    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 60 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 60 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 60 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 60 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%OtherEmpireName%]", Sys_Empire_Get_Empire_Name(plr_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (msg_deleted)
end

//------------------------------------------------------------------------
// Execute_Intel_System_Information
//------------------------------------------------------------------------
function Execute_Intel_System_Information returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  system_count:              long
  index:                     long
  sys_list:                  longlist
  system_id:                 long
  pick:                      long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Get number of systems
  set system_count := Sys_Get_Number_Of_Solar_Systems()

  // Generate a list of systems we haven't seen yet that have a colony of the target empire
  for index := 1 to system_count do
    if Sys_Player_Has_Colony_In_System(trg_plr, index) and (not Sys_Have_Seen_System(src_plr, index)) then
      call sys_list.add(index)
    endif
  endfor

  // Choose a system from the list of systems we haven't seen
  set system_count := sys_list.count()

  if (system_count > 0) then
    set pick := Sys_Get_Random_Long(1, system_count)
    set system_id := sys_list.get(pick)
    call Sys_Set_Have_Seen_System(src_plr, system_id)

    // Don't allow this project to be executed twice in a turn against the same player
    set bool_Skip_Intel_Event_System_Info := TRUE

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 61 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 61 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 61 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 61 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(system_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := trg_plr

    call Sys_Add_Empire_Log_Entry(src_plr, system_id, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
   
    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 62 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 62 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 62 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 62 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SystemName%]", Sys_Get_Solar_System_Name(system_id), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, system_id, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (system_count > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Information
//------------------------------------------------------------------------
function Execute_Intel_Empire_Information returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  colony_prod_res:           resources
  ship_prod_res:             resources
  trade_res:                 resources
  tariff_res:                resources
  remote_res:                resources
  expen_tariff_res:          resources
  expen_maintenance_res:     resources
  expen_spaceyard_res:       resources
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Note our enemy Empire's resource production and expenses
  set colony_prod_res := Sys_AI_Empire_Stats_Get_Colony_Resource_Production(trg_plr)
  set ship_prod_res := Sys_AI_Empire_Stats_Get_Ship_Resource_Production(trg_plr)
  set trade_res := Sys_AI_Empire_Stats_Get_Total_Resources_From_Trade(trg_plr)
  set tariff_res := Sys_AI_Empire_Stats_Get_Total_Resources_From_Tariffs(trg_plr)
  set remote_res := Sys_AI_Empire_Stats_Get_Total_Remote_Mined_Resources(trg_plr)
  set expen_tariff_res := Sys_AI_Empire_Stats_Get_Total_Tariff_Resources_Expenses(trg_plr)
  set expen_maintenance_res := Sys_AI_Empire_Stats_Get_Total_Maintenance_Resources_Expenses(trg_plr)
  set expen_spaceyard_res := Sys_AI_Empire_Stats_Get_Total_Construction_Resources_Expenses(trg_plr)

  // Don't allow this project to be executed twice in a turn against the same player
  set bool_Skip_Intel_Event_Empire_Info := TRUE

  // --- Log Message to Source Player --------------------------------------------------------------
  set log_type := LOG_TYPE_ESPIONAGE_BY_US
  set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63 Title")
  set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63 Text")
  set message_text  := Sys_ConCat_String(message_text, " ")
  set message_text  := Sys_ConCat_String(message_text, Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63a Text"))
  set message_text  := Sys_ConCat_String(message_text, " ")
  set message_text  := Sys_ConCat_String(message_text, Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63b Text"))
  set message_text  := Sys_ConCat_String(message_text, " ")
  set message_text  := Sys_ConCat_String(message_text, Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63c Text"))
  set message_text  := Sys_ConCat_String(message_text, " ")
  set message_text  := Sys_ConCat_String(message_text, Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63d Text"))
  set message_text  := Sys_ConCat_String(message_text, " ")
  set message_text  := Sys_ConCat_String(message_text, Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63e Text"))
  set message_text  := Sys_ConCat_String(message_text, " ")
  set message_text  := Sys_ConCat_String(message_text, Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63f Text"))
  set message_text  := Sys_ConCat_String(message_text, " ")
  set message_text  := Sys_ConCat_String(message_text, Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63g Text"))
  set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63 Small Picture Filename")
  set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 63 Large Picture Filename")

  set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%ColonyProdMinerals%]", Sys_Convert_Real_To_String(colony_prod_res.Get(RESOURCE_TYPE_MINERALS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%ColonyProdOrganics%]", Sys_Convert_Real_To_String(colony_prod_res.Get(RESOURCE_TYPE_ORGANICS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%ColonyProdRadioactives%]", Sys_Convert_Real_To_String(colony_prod_res.Get(RESOURCE_TYPE_RADIOACTIVES)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%ShipProdMinerals%]", Sys_Convert_Real_To_String(ship_prod_res.Get(RESOURCE_TYPE_MINERALS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%ShipProdOrganics%]", Sys_Convert_Real_To_String(ship_prod_res.Get(RESOURCE_TYPE_ORGANICS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%ShipProdRadioactives%]", Sys_Convert_Real_To_String(ship_prod_res.Get(RESOURCE_TYPE_RADIOACTIVES)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%TradeProdMinerals%]", Sys_Convert_Real_To_String(trade_res.Get(RESOURCE_TYPE_MINERALS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%TradeProdOrganics%]", Sys_Convert_Real_To_String(trade_res.Get(RESOURCE_TYPE_ORGANICS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%TradeProdRadioactives%]", Sys_Convert_Real_To_String(trade_res.Get(RESOURCE_TYPE_RADIOACTIVES)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%TariffProdMinerals%]", Sys_Convert_Real_To_String(tariff_res.Get(RESOURCE_TYPE_MINERALS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%TariffProdOrganics%]", Sys_Convert_Real_To_String(tariff_res.Get(RESOURCE_TYPE_ORGANICS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%TariffProdRadioactives%]", Sys_Convert_Real_To_String(tariff_res.Get(RESOURCE_TYPE_RADIOACTIVES)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%RemoteProdMinerals%]", Sys_Convert_Real_To_String(remote_res.Get(RESOURCE_TYPE_MINERALS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%RemoteProdOrganics%]", Sys_Convert_Real_To_String(remote_res.Get(RESOURCE_TYPE_ORGANICS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%RemoteProdRadioactives%]", Sys_Convert_Real_To_String(remote_res.Get(RESOURCE_TYPE_RADIOACTIVES)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%TariffExpenMinerals%]", Sys_Convert_Real_To_String(expen_tariff_res.Get(RESOURCE_TYPE_MINERALS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%TariffExpenOrganics%]", Sys_Convert_Real_To_String(expen_tariff_res.Get(RESOURCE_TYPE_ORGANICS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%TariffExpenRadioactives%]", Sys_Convert_Real_To_String(expen_tariff_res.Get(RESOURCE_TYPE_RADIOACTIVES)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%MaintExpenMinerals%]", Sys_Convert_Real_To_String(expen_maintenance_res.Get(RESOURCE_TYPE_MINERALS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%MaintExpenOrganics%]", Sys_Convert_Real_To_String(expen_maintenance_res.Get(RESOURCE_TYPE_ORGANICS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%MaintExpenRadioactives%]", Sys_Convert_Real_To_String(expen_maintenance_res.Get(RESOURCE_TYPE_RADIOACTIVES)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%ConstrExpenMinerals%]", Sys_Convert_Real_To_String(expen_spaceyard_res.Get(RESOURCE_TYPE_MINERALS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%ConstrExpenOrganics%]", Sys_Convert_Real_To_String(expen_spaceyard_res.Get(RESOURCE_TYPE_ORGANICS)), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%ConstrExpenRadioactives%]", Sys_Convert_Real_To_String(expen_spaceyard_res.Get(RESOURCE_TYPE_RADIOACTIVES)), TRUE, TRUE)

  set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
  set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
  set plr_caused := trg_plr

  call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

  // --- Log Message to Target Player --------------------------------------------------------------
  set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
  set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 64 Title")
  set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 64 Text")
  set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 64 Small Picture Filename")
  set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 64 Large Picture Filename")

  set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
  set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)

  set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
  set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
  set plr_caused := 0

  call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
  call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

  return TRUE
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Unit_Designs_Information
//------------------------------------------------------------------------
function Execute_Intel_Empire_Unit_Designs_Information returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  design_count:              long
  index:                     long
  design_id:                 long
  design_list:               longlist
  pick:                      long
  design_name:               string
  design_size_name:          string
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Select a target Empire's design that is current
  set design_count := Sys_Get_Player_Designs_Count(trg_plr)

  if (design_count > 0) then 
    for index := 1 to design_count do
      set design_id := Sys_Get_Player_Design_ID(trg_plr, index)
      if (Sys_Is_Vehicle_Design_Unit(design_id)) then
        if (Sys_Has_Vehicle_Design_Been_Used(design_id)) then
          if (Sys_Get_Vehicle_Design_Date_Last_Seen(design_id, src_plr) = 0) then
            call design_list.add(design_id)
          endif
        endif
      endif
    endfor
  endif

  // Steal the design
  set design_count := design_list.count()

  if (design_count > 0) then
    set pick := Sys_Get_Random_Long(1, design_count)
    set design_id := design_list.Get(pick)
    set design_name := Sys_Get_Vehicle_Design_Name(design_id)
    set design_size_name := Sys_Get_Vehicle_Design_Size_Name(design_id)
    call Sys_Set_Vehicle_Design_Date_Last_Seen(design_id, src_plr, sys_long_Game_Date)

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 65 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 65 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 65 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 65 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%DesignName%]", design_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%DesignSizeName%]", design_size_name, TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := trg_plr

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 66 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 66 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 66 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 66 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%DesignName%]", design_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%DesignSizeName%]", design_size_name, TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (design_count > 0)
end

//------------------------------------------------------------------------
// Execute_Intel_Empire_Tech_Reports
//------------------------------------------------------------------------
function Execute_Intel_Empire_Tech_Reports returns boolean
params
  src_plr:                   long
  trg_plr:                   long
vars
  tech_count:                long
  index:                     long
  tech_level:                long
  tech_id:                   long
  tech_area_list:            longlist
  pick:                      long
  final_area_list:           longlist
  final_count:               long
  tech_name1:                string
  tech_name2:                string
  tech_name3:                string
  tech_level1:               long
  tech_level2:               long
  tech_level3:               long
  message_title:             string
  message_text:              string
  msg_small_pic:             string
  msg_large_pic:             string
  log_type:                  long
  log_cat:                   long
  log_sub_cat:               long
  plr_caused:                long
begin

  // Create a list of tech areas that the target Empire has
  set tech_count := Sys_Get_Tech_Area_Count()

  if (tech_count > 0) then
    for index := 1 to tech_count do
      set tech_id := Sys_Get_Tech_By_Index(index)
      set tech_level := Sys_Get_Empire_Research_Tech_Level(trg_plr, tech_id)
      if (tech_level > 0) then
        call tech_area_list.add(tech_id)
      endif
    endfor
  endif

  // Pick up to 3 tech areas from the list to add to the report
  set tech_count := tech_area_list.count()
  set final_count := 0
  loop
    if (tech_count > 0) and (final_count < 3) then
      set pick := Sys_Get_Random_Long(1, tech_count)
      set tech_id := tech_area_list.get(pick)
      call final_area_list.add(tech_id)
      set final_count := final_area_list.count()
      call tech_area_list.delete(pick)
      set tech_count := tech_area_list.count()
    endif
    exitwhen (tech_count <= 0) or (final_count = 3)
  endloop

  if (final_count > 0) then
    set tech_name1 := Sys_Get_Tech_Area_Name(final_area_list.get(1))
    set tech_name2 := ""
    set tech_name3 := ""
    set tech_level1 := Sys_Get_Empire_Research_Tech_Level(trg_plr, final_area_list.get(1))
    set tech_level2 := 0
    set tech_level3 := 0

    if (final_count >= 2) then
      set tech_name2 := Sys_Get_Tech_Area_Name(final_area_list.Get(2))
      set tech_level2 := Sys_Get_Empire_Research_Tech_Level(trg_plr, final_area_list.get(2))
    endif

    if (final_count >= 3) then
      set tech_name3 := Sys_Get_Tech_Area_Name(final_area_list.Get(3))
      set tech_level3 := Sys_Get_Empire_Research_Tech_Level(trg_plr, final_area_list.get(3))
    endif

    // --- Log Message to Source Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_BY_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 67 Title")
    case (final_count)
      1:
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 67a Text")
      2:
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 67b Text")
      3:
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 67c Text")
    endcase
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 67 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 67 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechName1%]", tech_name1, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechName2%]", tech_name2, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechName3%]", tech_name3, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechLevel1%]", Sys_Convert_Long_To_String(tech_level1), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechLevel2%]", Sys_Convert_Long_To_String(tech_level2), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechLevel3%]", Sys_Convert_Long_To_String(tech_level3), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := trg_plr

    call Sys_Add_Empire_Log_Entry(src_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)

    // --- Log Message to Target Player --------------------------------------------------------------
    set log_type := LOG_TYPE_ESPIONAGE_AGAINST_US
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 68 Title")
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 68 Text")
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 68 Small Picture Filename")
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, "Intel Message 68 Large Picture Filename")

    set message_text := Sys_Replace_String(message_text, "[%TargetEmpireName%]", Sys_Empire_Get_Empire_Name(trg_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechName1%]", tech_name1, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechName2%]", tech_name2, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechName3%]", tech_name3, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechLevel1%]", Sys_Convert_Long_To_String(tech_level1), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechLevel2%]", Sys_Convert_Long_To_String(tech_level2), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, "[%TechLevel3%]", Sys_Convert_Long_To_String(tech_level3), TRUE, TRUE)

    set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
    set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_POLITICS_AND_INTEL
    set plr_caused := 0

    call Add_Suspect_Text(src_plr, trg_plr, message_text, plr_caused)
    call Sys_Add_Empire_Log_Entry(trg_plr, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type, log_cat, log_sub_cat, plr_caused)
  endif

  return (final_count > 0)
end

//------------------------------------------------------------------------
// Add_Suspect_Text
//------------------------------------------------------------------------
function Add_Suspect_Text returns boolean
params
  src_plr:                   long
  trg_plr:                   long
  message_text:              string byref
  plr_caused:                long byref
vars
  msg_choice:                long
  field_name:                string
begin
  return FALSE

  // 25% chance to reveal source Empire of the intel attack
  if (Sys_Get_Random_Long(1, 4) = 1) then
    set plr_caused := src_plr

    // Choose the message to send
    set msg_choice := Sys_Get_Random_Long(1, 5)
    case (msg_choice)
      1:
        set field_name  := "Intel Message 69a Text"
      2:
        set field_name  := "Intel Message 69b Text"
      3:
        set field_name  := "Intel Message 69c Text"
      4:
        set field_name  := "Intel Message 69d Text"
      5:
        set field_name  := "Intel Message 69e Text"
    endcase

      set message_text := message_text + " "
    set message_text := message_text + Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Intel_Text_ID, field_name)
    set message_text := Sys_Replace_String(message_text, "[%SourceEmpireName%]", Sys_Empire_Get_Empire_Name(src_plr), TRUE, TRUE)
    return TRUE
  endif

end

//------------------------------------------------------------------------
// Compute_Average_Distance_To_Player
//------------------------------------------------------------------------
function Compute_Average_Distance_To_Player returns long
params
  src_plr:                   long
  trg_plr:                   long
vars
  lst_colony:                longlist
  colony_count:              long
  colony_index:              long
  colony_id:                 long
  colony_sys:                long
  colony_sys_dist:           long
  total_sys_dist:            long
  trg_home_sys:              long
  avg_sys_dist:              long
begin

  // Note our target's home system
  set trg_home_sys := Sys_Get_Empire_Home_System(trg_plr)

  // What's the average distance from to their home system from our colonies?
  set colony_count := Sys_Get_List_Of_Players_Colonies(src_plr, lst_colony)
  // Sum up the total system distance to each colony
  if (colony_count > 0) then
    for colony_index := 1 to colony_count do
      set colony_id := lst_colony.get(colony_index)
      // What's the colony's system?
      set colony_sys := Sys_Get_Space_Object_System_Location(colony_id)
      // What's the systems distance to this colony from our home system?
      set colony_sys_dist := Sys_Get_System_Distance_Between_Solar_Systems(trg_home_sys, colony_sys)
      set total_sys_dist := total_sys_dist + colony_sys_dist
    endfor
  endif

  // Calculate the average
  if (colony_count > 0) then
    set avg_sys_dist := Sys_Divide_Long(total_sys_dist, colony_count)
  endif

  return avg_sys_dist
end

//------------------------------------------------------------------------
// Compute_Nearest_Colony_To_Target
//------------------------------------------------------------------------
function Compute_Nearest_Colony_To_Target returns long
params
  src_plr:                   long
  trg_plr:                   long
  sobj_sys:                  long
vars
  lst_colony:                longlist
  colony_count:              long
  colony_index:              long
  colony_id:                 long
  colony_sys:                long
  this_dist:                 long
  min_dist:                  long := 999
begin

  // What's the closest source player colony to the target player attack location?
  set colony_count := Sys_Get_List_Of_Players_Colonies(src_plr, lst_colony)
  // Sum up the total system distance to each colony
  if (colony_count > 0) then
    loop
      set colony_index := colony_index + 1
      set colony_id := lst_colony.get(colony_index)
      // What's the colony's system?
      set colony_sys := Sys_Get_Space_Object_System_Location(colony_id)
      // What's the systems distance to this colony from our home system?
      set this_dist := Sys_Get_System_Distance_Between_Solar_Systems(colony_sys, sobj_sys)
      // Find the minimum distance
      if (this_dist < min_dist) then
        set min_dist := this_dist
      endif
      exitwhen (min_dist <= 1) or (colony_index >= colony_count)
    endloop
  endif

  return min_dist
end

//------------------------------------------------------------------------
// Get_Treaty_Element_Type_Name
//------------------------------------------------------------------------
function Get_Treaty_Element_Type_Name returns string
params
  elem_type:                 long
vars
  elem_type_name:            string
begin

  // Get the corresponding order name (For debug purposes)
  case elem_type
    TREATY_ELEMENT_TYPE_TRADE_PERCENT:
      set elem_type_name := "trade"
    TREATY_ELEMENT_TYPE_NON_AGGRESSION:
      set elem_type_name := "non-aggression"
    TREATY_ELEMENT_TYPE_MUTUAL_DEFENSE_PACT:
      set elem_type_name := "mutual defense"
    TREATY_ELEMENT_TYPE_ALLOW_MIGRATION_BETWEEN_COLONIES:
      set elem_type_name := "migration"
    TREATY_ELEMENT_TYPE_TREATIES_WITH_OTHERS:
      set elem_type_name := "no treaties with others"
    TREATY_ELEMENT_TYPE_SHARE_RESUPPLY:
      set elem_type_name := "sharing resupply"
    TREATY_ELEMENT_TYPE_SHARE_REPAIR:
      set elem_type_name := "sharing repair"
    TREATY_ELEMENT_TYPE_SHARE_TECHNOLOGY:
      set elem_type_name := "technology sharing"
    TREATY_ELEMENT_TYPE_SHARE_SYSTEM_MAPS:
      set elem_type_name := "sharing maps"
    TREATY_ELEMENT_TYPE_SHARE_COMMUNICATION_CHANNELS:
      set elem_type_name := "sharing comm channels"
    TREATY_ELEMENT_TYPE_SHARE_ESPIONAGE_INFO:
      set elem_type_name := "sharing espionage reports"
    TREATY_ELEMENT_TYPE_SHARE_SENSOR_INFO:
      set elem_type_name := "sharing sensor data"
    TREATY_ELEMENT_TYPE_SHARE_DESIGNS:
      set elem_type_name := "sharing designs"
    TREATY_ELEMENT_TYPE_SHARE_CODES_FOR_MINEFIELDS:
      set elem_type_name := "sharing minefield codes"
    TREATY_ELEMENT_TYPE_SHARE_COMBAT_REPORTS:
      set elem_type_name := "sharing combat reports"
    TREATY_ELEMENT_TYPE_CANNOT_RESEARCH:
      set elem_type_name := "no research projects"
    TREATY_ELEMENT_TYPE_CANNOT_INTELLIGENCE:
      set elem_type_name := "no intelligence projects"
    TREATY_ELEMENT_TYPE_CANNOT_BOMBARD_PLANETS:
      set elem_type_name := "no bombardment"
    TREATY_ELEMENT_TYPE_CANNOT_USE_VIRAL_WEAPONS:
      set elem_type_name := "no viral weapons"
    TREATY_ELEMENT_TYPE_CANNOT_DESTROY_PLANETS:
      set elem_type_name := "cannot destroy planets"
    TREATY_ELEMENT_TYPE_CANNOT_DESTROY_STARS:
      set elem_type_name := "cannot destroy stars"
    TREATY_ELEMENT_TYPE_CANNOT_CREATE_BLACKHOLES:
      set elem_type_name := "cannot create black holes"
    TREATY_ELEMENT_TYPE_CANNOT_CREATE_NEBULAE:
      set elem_type_name := "cannot create nebulae"
    TREATY_ELEMENT_TYPE_CANNOT_USE_CLOAKING:
      set elem_type_name := "no cloaking"
    TREATY_ELEMENT_TYPE_RESOURCE_TARIFF:
      set elem_type_name := "appears one party pays a tariff"
    TREATY_ELEMENT_TYPE_SHARE_PLAGUE_CURING:
      set elem_type_name := "share plague cures"
  endcase

  return elem_type_name
end

//------------------------------------------------------------------------